У меня уже довольно давно работает следующий код:
$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
, но файлы не добавляются в архив.
Кто-нибудь тоже испытывал это? Любая помощь или руководство очень ценится.
Вы, вероятно, должны проверить, работает ли $ 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);
}
}