PHP内容长度标题没有指定我的强制下载的大小

我试图让我们的用户能够下载一个使用php强制下载的zip文件。 我在下载完成时遇到了麻烦,事实certificatezip文件被压缩并发送到浏览器,然后内容长度标题会在下载完成之前停止下载(因为压缩zip文件会使文件变大)所以我把这个添加到我的代码中:

if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); } 

添加完后,可以打开下载的zip文件,但Content-Length文件头不再被发送。 我检查了使用萤火虫发送的标题,下载不再有进度条。 我不确定是否下载正在工作,因为它们不再被gzip压缩,或者由于内容长度头不再被发送(而且更大的gzip文件正在被完全下载)。 我也想知道为什么添加这三行会导致内容长度标题消失?

这里是强制下载的部分:

  if(ini_get('zlib.output_compression')) { ini_set('zlib.output_compression', 'Off'); } // Display the download ob_end_clean(); 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); 

不要通过PHP应用程序pipe道文件,这是非常无效的。 你可以很容易地使用Nginx的内置function。 这就是所谓的X-Accel-Redirect ,这是你需要从PHP返回的头文件。 Nginx会看到它并将文件发送到浏览器,而您的PHP进程已经可以自由地处理其他请求。

文档在这里

执行以下操作之一:

  • 将ob_end_clean更改为ob_clean
  • 完全删除ob_end_clean

我真的不知道为什么这样工作。 去bugs.php.net可能会出现一些东西。

我想,在closuresPHP的gzip后,我的nginx设置,然后使用gzip压缩,因为他们都gzip打开。 我不得不添加一个新的头文件,将内容编码设置为application / zip,以便nginx不会尝试使用gzip压缩它。 我加了这行代码:

  header('Content-Encoding: application/zip');