我有一个下载功能的问题。在我的系统中,我喜欢进行安全下载。在我的根文件不能通过url访问。我将ftp权限设置为700。只有服务器可以访问。之后,我做了一个可以为用户下载文件的功能。此时,我可以对会话进行安全检查。
但是当服务器通过这段代码下载文件时,该文件在浏览器中打开。使用exe时,浏览器会显示奇怪的字母。
// Bestandsnaam
$file = 'bestanden/test.exe';
// Ophalen bestand
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
我想要一个保存框当用户访问url。
我想这样使用这个函数:
<a href="www.site.nl/downloadfunction/file">download</a>
有人有解决办法吗?我尝试了Javascript document.execCommand('SaveAs',null,bestand);
而不是readfile但它在Firefox中不起作用。
谢谢你的帮助!
尝试将ob_clean
置于标题之上。如果这些标头在当前代码中成功发送,我甚至怀疑您是否需要ob_clean.
在头函数之前的输出中可能有一些字符,因为代码看起来是正确的。在这种情况下,您还应该将error_display
设置为关闭,否则您应该收到警告。
检查在if
之后的headers_sent函数。
我使用完全相同的代码,它工作得很好。
然而,客户端做什么取决于浏览器的参数。如果文件类型在浏览器中被设置为"总是打开",并且默认的下载动作是"下载无需询问",它将1)下载默认下载文件夹中的文件,2)打开它。您只需勾选"下载前询问每个文件的保存位置"即可获得此框。
使用下载帮助器:
function process($file)
{
$this->load->helper('download');
$data = file_get_contents("my-downloads/$file"); // Read the file's contents
force_download($file, $data);
}
应该照顾细节(头,mime类型检测),否则你需要摆弄。
如果您对细节感兴趣,可以获得源代码。