我无法解决文件下载问题。在Chrome中,下载工作正常。在Firefox中,它会在文件末尾生成一些HTML标题,如:
<!DOCTYPE .....>
...
...
对于其他一些浏览器,下载的文件也会遗漏一些行。如何编写脚本以使其适用于许多浏览器?这是我目前的代码:
private function downloadRawFileHelper($file) {
if (ini_get('zlib.output_compression')) {
ini_set('zlib.output_compression', 'Off');
}
if (!file_exists($file)) {
die('File Not Found');
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: text/php");
header("Content-Disposition: attachment; filename=\"". basename($file). "\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($file));
ob_clean();
flush();
readfile($file);
$this->view = 'fileedit';
}
答案 0 :(得分:1)
尝试在exit
之后加readfile
,我认为这可以解决您的问题
答案 1 :(得分:0)
我发现代码没有任何问题。您可以尝试在功能结束时添加exit()
或die()
吗?将其更改为:
private function downloadRawFileHelper($file) {
if (ini_get('zlib.output_compression')) {
ini_set('zlib.output_compression', 'Off');
}
if (!file_exists($file)) {
die('File Not Found');
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: text/php");
header("Content-Disposition: attachment; filename=\"". basename($file). "\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize($file));
ob_clean();
flush();
readfile($file);
$this->view = 'fileedit';
exit();
}
您正在将文件输出到浏览器。所以你需要在那之后停止脚本执行。
希望这会有所帮助:)
答案 2 :(得分:0)
在flush()
之前ob_end_clean();
添加exit()
和readfile()
之前。此外,您可以考虑使用X-SendFile而不是纯PHP将文件发送到客户端,因为这会在大文件的情况下占用宝贵的资源。
答案 3 :(得分:0)
这是你的问题:
header("Content-Disposition: attachment; filename=\"". basename($file). "\"");
尝试为您的archivo命名,例如:
header("Content-Disposition: attachment; filename=\"". basename($file). "filename.extension\"");
答案 4 :(得分:0)
调试HTTP问题的最佳方法是实际检查发送的HTTP消息。今天的浏览器使这很容易。
如果该网站是公开的,您可以尝试使用redbot.org来检查响应。
最后,您要发送大量未定义和/或无用的响应头字段,例如“Content-Transfer-Encoding”或Cache-Control中的“check”指令。