创建和服务用PHP压缩文件(Creating and serving zipped files wi

2019-07-18 06:47发布

我尝试使用下面的代码从一个目录下创建一个zip文件,并将其用于通过HTTP下载用户:

 // write the file
file_put_contents($path . "/index.html", $output);

// zip up the contents
chdir($path);
exec("zip -r {$course->name} ./");

$filename = "{$course->name}.zip";

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' .urlencode($filename));
header('Content-Transfer-Encoding: binary');

readfile($filename);

我能够创建压缩文件,但下载它通过HTTP不工作。 如果我下载的是别人使用FTP客户端创建的zip文件,然后Mac的Stuffit扩展解压缩文件就好了,但如果我下载它通过HTTP的MAC unzipper创建一个无限循环。 我的意思是说,我下载的文件被称为course.zip,然后解压缩文件给course.zip.cpgz和解压该文件提供了course.zip again..and和。

有人有主意吗?

谢谢!

Answer 1:

  1. 再拉上每次请求时间,它是不是一个好主意。 尝试这样做,只有当ZIP文件不存在。

  2. 如果是要传送的压缩挥发性文件或只是一个很小的文件,请尝试使用ob_start('ob_gzhandler')代替,simplier,更小,更清洁。 该文件被转移压缩,但它被保存在由客户端的原始格式。

  3. 指定Content-Length头是需要允许下载知道文件的结尾,让进度控制,检测文件的腐败,避免了HTTP会话的挂起(如果连接是在保持模式下),可能缺乏此标头的是问题的根源。



Answer 2:

我有这个问题,它原来下载的zip文件必须在一开始插入新行。

通过使用ob_clean和冲洗功能解决

    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=".basename($archive_file_name));
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize($archive_file_name));
    ob_clean();
    flush();
    echo readfile("$archive_file_name");


Answer 3:

正如建议karim79 ,我会把我的评论作为一个答案:如果你从应用程序/八位字节流改变MIME类型应用程序/压缩会发生什么?

另外,我看到你使用命令行zip程序,但你不检查拉链的成功,如果该文件试图将它发送给最终用户的浏览器之前,也存在不检查。 尝试硬编码文件名,使用手动压缩,以保证正确格式的压缩文件,然后看看你的代码将它吐到浏览器正常。



Answer 4:

你看到的是,归档工具不能识别zip文件作为一个zip文件,并试图拉上拉链存档本身。 第二个操作简单的解压缩创建的第一个文件,所以从来没有真正打开该文件在所有。 对被损坏的zip这是由于。

这可能是浏览器在下载过程中莫名其妙错位的zip文件(换行转换的人?)。 如所提到的,检查mime类型和使用PHP header()函数来设定正确的MIME类型(应用程序/压缩)。



文章来源: Creating and serving zipped files with php
标签: php zip gzip unzip