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() будет работать, хотя

Другие вопросы по тегам