使用PHP下载脚本发送正确的文件大小

使用PHP下载脚本发送正确的文件大小,php,cross-browser,browser,download,Php,Cross Browser,Browser,Download,我用PHP创建了一个文件下载脚本,它可以工作,但web浏览器报告该文件为“未知长度”。我的代码如下: function downloadFile($file){ // Set up the download system... header('Content-Description: File Transfer'); header('Content-Type: '.mime_content_type($file)); header('Content-Disposition: at

我用PHP创建了一个文件下载脚本,它可以工作,但web浏览器报告该文件为“未知长度”。我的代码如下:

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;
}

尝试在readfile()函数之前不刷新缓存。除此之外,我的代码与您的代码几乎相同,并且工作正常。

最初来自:

通过一个健壮的PHP脚本来验证下载,该脚本类似于年Andrew Johnson发布的脚本

Andrew在文章末尾发表了一个非常重要的评论:

“如果使用Zlib、mod_deflate等压缩文件,则内容长度标题将不准确,因此在下载文件时,您将看到“未知大小”和“未知剩余时间”

我想强调这一点:如果您的浏览器似乎没有遵守PHP脚本生成的标题,特别是
内容长度
,则很可能启用了Apache的
mod_deflate
扩展

您可以使用适用的
.htaccess
文件中的以下行轻松地为单个脚本禁用它:

SetEnvIfNoCase Request_URI ^/download\.php no-gzip dont-vary
此处假设download.php位于服务器根目录路径中的下载脚本中(例如
www.crimsonbase.com/download.php
)。(这是因为正则表达式是
^/download\.php


我也遇到了同样的问题,我通过在
内容处置
之前发送
内容长度
标题来修复它

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);

试过了,什么都没有。下载仍然可以正常工作,只是网络浏览器会说“未知文件大小”,尽管我给了它一个“内容长度”。问题是,如果我使用wget,它会报告正确的文件大小。我需要调查一下。谢谢你,我在下载中得到了“gzip”内容类型,并且能够用你的htaccess线路删除它,现在我可以再次看到下载进度,因为浏览器可以正确读取总文件大小。