我试图开始强制下载包含大量图像的zip文件。 我使用PHP来强制下载,它在nginx上运行。 奇怪的是,当我使用wget下载它通常工作的文件,但是当我尝试使用浏览器下载它时,文件最终变成了几千字节。 我已经尝试了多个文件大小相似的结果。 我不认为这是一个超时错误,因为我玩的放缓下载速度,它总是停在同一个地方(在该特定的文件)。 我不知道为什么它会在wget上工作,而不是浏览器。 我已经在多台计算机(不同的浏览器)和多个networking上尝试过,得到了相同的结果。 我已经玩弄了PHP代码,提供的文件和php.ini和nginx设置无济于事。 我真的很感谢任何人的帮助或build议,这真的会帮助我!
这是我强迫下载的PHP代码:
ob_end_flush(); header('Content-Description: File Transfer'); header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="'.$name.'.zip"'); 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($archive)); flush(); readfile($archive);
其中$ archive是用户尝试下载的zip文件的path。
您的web服务器可以将gzip Content-Encoding应用于从PHP输出的文件(或者您是否可以在PHP本身中启用它,例如zlib.output_compression )? 压缩已压缩的文件往往会使实际文件变大,所以如果客户端读取脚本的Content-Length头,它将在输出“更大”的压缩文件之前停止下载。
wget不支持压缩,因此服务器在连接wget时不会尝试使用Content-Encoding。 尝试curl ,看看你是否得到了破损的文件。 如果您使用Chrome,请按Ctrl – Shift – J打开“开发人员工具”并转到“networking”选项卡。 在打开的时候,回到你打开的主窗口,点击链接下载文件。 它应该在请求列表中创build一个你可以点击的条目,这个条目将打开一个带有“标题”标签的子窗口,在这里你可以看到它是否在“ Response Headers:部分有Content-Encoding:行。
顺便说一句,我想你想做ob_end_clean()那里,而不是ob_end_flush()因为_flush()发送客户端中的任何你在缓冲区,而_clean()删除缓冲区和任何头已经在它。