我尝试使用下面的代码从一个目录下创建一个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和。
有人有主意吗?
谢谢!
我有这个问题,它原来下载的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");
正如建议karim79 ,我会把我的评论作为一个答案:如果你从应用程序/八位字节流改变MIME类型应用程序/压缩会发生什么?
另外,我看到你使用命令行zip程序,但你不检查拉链的成功,如果该文件试图将它发送给最终用户的浏览器之前,也存在不检查。 尝试硬编码文件名,使用手动压缩,以保证正确格式的压缩文件,然后看看你的代码将它吐到浏览器正常。
你看到的是,归档工具不能识别zip文件作为一个zip文件,并试图拉上拉链存档本身。 第二个操作简单的解压缩创建的第一个文件,所以从来没有真正打开该文件在所有。 对被损坏的zip这是由于。
这可能是浏览器在下载过程中莫名其妙错位的zip文件(换行转换的人?)。 如所提到的,检查mime类型和使用PHP header()函数来设定正确的MIME类型(应用程序/压缩)。