PHP ZipArchive работал, но теперь создает недопустимые файлы ZIP
Я имел обыкновение создавать динамические 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
метод) но я не нашел решения.
Спасибо
1 ответ
Я добавил 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()
будет работать, хотя