我在PHP中创建了一个文件下载脚本,它可以工作,但是Web浏览器将文件报告为“Unknown Length”。我的代码如下:
function downloadFile($file){
// Set up the download system...
header('Content-Description: File Transfer');
header('Content-Type: '.mime_content_type($file));
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));
// Flush the cache
ob_clean();
flush();
// Send file to browser
readfile($file);
// DO NOT DO ANYTHING AFTER FILE DOWNLOAD
exit;
}
答案 0 :(得分:15)
最初来自http://paul.luminos.nl/update/471:
CrimsonBase website通过传递类似于Andrew Johnson在his article about PHP-controlled file downloads中发布的强大PHP脚本来验证下载。
安德鲁在文章末尾发表了非常重要的评论:
“如果压缩文件使用zlib的,mod_deflate模块等的Content-Length头将不准确,所以你最终看到‘未知大小’和‘未知剩余时间’下载文件的时候。”
我想强调这一点:如果你的浏览器似乎不被服从你的PHP生成的头脚本,特别是
Content-Length
- 这是相当可能的是Apache的mod_deflate
扩展功能。您可以使用适用的
.htaccess
文件中的以下行轻松地为单个脚本禁用它:SetEnvIfNoCase Request_URI ^/download\.php no-gzip dont-vary
其中download.php在此处假定位于服务器根目录路径中的下载脚本中(例如
www.crimsonbase.com/download.php
)。 (那是因为正则表达式是^/download\.php
。)
答案 1 :(得分:6)
我遇到了同样的问题,我通过在Content-Length
之前发送Content-Disposition
标题来修复它。
header('Content-Type: video/mp4');
header("Content-Transfer-Encoding: Binary");
header("Content-Length: ".filesize($file_url));
header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\"");
readfile($file_url);
答案 2 :(得分:0)
尝试在readfile()函数之前不刷新缓存。我的代码几乎与你的代码相同,并且工作正常。