2009-12-29 48 views
6

我在PHP中创建了一个文件下载脚本,它工作正常,但是网页浏览器将文件报告为“未知长度”。我的代码如下:用PHP下载脚本发送正确的文件大小

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

回答

13

最初从http://paul.luminos.nl/update/471

CrimsonBase website通过使它们通过一个类似于由安德鲁·约翰逊在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。)

+0

有趣。我需要研究一下。 – 2010-03-12 17:13:34

+0

谢谢,我在下载时收到了“gzip”内容类型,并且能够通过htaccess线删除它,现在我可以再次看到下载进度,因为浏览器正确读取了文件总大小。 – adrianTNT 2014-10-23 19:36:17

0

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

+0

试过,没有。下载仍然正常,只是网页浏览器会说“未知文件大小”,即使我给它一个“内容长度”。事情是,如果我使用wget,它会报告正确的文件大小。 – 2009-12-30 21:17:42

6

我有这个同样的问题,我在之前Content-Disposition发送Content-Length头固定它。

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