Перестал работать PHP ZipArchive addFile

У меня уже довольно давно работает следующий код:

$thisdir = "$_SERVER[DOCUMENT_ROOT]/webroot/uploads/user_uploaded_files/";

    if( !empty( $files ) ){

     $destination = 'uploads/zip_files/meeting_' . $meetingId .'.zip';

     $zip = new ZipArchive();

     $zip->open( $destination, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE );

     //Add all the uploaded files ( $file = filename.ext )

         foreach( $files as $file ){

             if(file_exists( $thisdir . $file )){

                $zip->addFile('/uploads/user_uploaded_files/' . $file, $file);

         }
}

Тем не менее, он только недавно перестал работать (не уверен в предыдущей, но текущая версия 7.0.9).

цикл foreach работает как раньше, file_exists всегда возвращается true, но файлы не добавляются в архив.

Кто-нибудь тоже испытывал это? Любая помощь или руководство очень ценится.

2 ответа

Вы, вероятно, должны проверить, работает ли $zip->open:

$res = $zip->open($destination, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
if ($res) {
    foreach ($files as $file) {
        if (file_exists($thisdir . $file)) {
            $zip->addFile('/uploads/user_uploaded_files/' . $file, $file);
        }
    }
}

Вы могли бы добавить

error_reporting(E_ALL);
ini_set('display_errors', true);

в начале вашего скрипта, и посмотрите, есть ли какая-либо ошибка.

Просто нашел решение этой проблемы и надеюсь, что это может кому-то помочь в будущем.

$files был массив строк, таким образом, зацикливая его следующим образом: foreach( $files as $file ) Я всегда получал одну строку.

По крайней мере, я так думал, однако addFile() видимо не читал это как строку.

Проблема была решена простым кастом каждого предмета перед addFile(), Решение выглядит так:

foreach( $files as $file ){

    if(file_exists( $thisdir . $file )){

        $file = (string)$file;

        $zip->addFile('uploads/user_files/' . $file, $file);

    }

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