我曾经能够用这个来创建动态zip文件:
if(isset($_POST['files'])) {
$zip = new ZipArchive();
$zip_name = $_POST['name'].".zip";
if($zip->open($zip_name, ZIPARCHIVE::CREATE)===TRUE) {
foreach($_POST['files'] as $file){
//here $file is like 'path/to/file.pdf' with no special characters in the name
$name = basename($file);
if(file_exists($file)){
$zip->addFile($file, $name);
}
}
$zip->close();
if(file_exists($zip_name)) {
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="'.$zip_name.'"');
readfile($zip_name);
unlink($zip_name);
}
}
}
但是现在它创建了无效的zip文件。在Windows中你会收到一条错误消息,在Mac上你得到一个永无止境的zip文件循环。我已就其他问题(包括addFromSting
方法)尝试了很多不同的建议,但我还没有找到解决方案。
感谢您
答案 0 :(得分:0)
我添加clearstatcache();
来帮助,以及header('Content-Length: ' . filesize($zip_name));
进行仔细检查,生成的zip文件似乎总是合适的大小,无论包含哪些文件
我最后还是尝试了几件事,直到我偶然发现了一条线索。 file_exists()
中的foreach
始终是假的。在启动时,它看起来相对于域,但在某些地方它开始看起来相对于脚本所在的位置。所以我添加了一点点它并开始工作
if(file_exists($file)){
$zip->addFile($file, $name);
} else if(file_exists('../../../'.$file)){
$zip->addFile('../../../'.$file, $name);
}
仍然不知道为什么filesize()
会起作用