ZipArchive .zip-файл для отображения всех файлов в root

#php #compression

#php #сжатие

Вопрос:

Я хочу, чтобы код преобразовывал все файлы в дереве в zip-файлы в корневом каталоге

    <?PHP
// create object
$zip = new ZipArchive();

// open archive 
if ($zip->open('my-archive.zip', ZIPARCHIVE::CREATE) !== TRUE) {
    die ("Could not open archive");
}

// list of files to add
// list of files to add
$fileList = array(
    'im/asd.pdf',
    'im/df.pdf',
    'im/d/qoyyum.txt'
);

// add files
foreach ($fileList as $f) {
    $zip->addFile($f) or die ("ERROR: Could not add file: $f");   
}

// close and save archive
$zip->close();
echo "Archive created successfully.";    
?> 
  

например, папка /im содержит

 /im/asd.pdf
/im/df.pdf
/im/d/qoyyum.txt
  

‘my-archive.zip ‘ извлечение должно выглядеть следующим образом

 my-archive/asd.pdf
my-archive/df.pdf
my-archive/qoyyum.txt
  

Я хочу предотвратить иерархию папок при извлечении zip-файла. чтобы все файлы находились в корневом каталоге извлеченной zip-папки

пожалуйста, предложите совет, как это сделать

Ответ №1:

В ZipArchive::addFile() вызываемом localname файле есть второй параметр (смотрите здесь), который позволяет вам задать локальное имя файла в zip-архиве. Используйте это, чтобы переопределить структуру каталогов, которая используется по умолчанию.

 foreach ($fileList as $f) {
    $filename_parts = explode('/', $f);  // Split the filename up by the '/' character
    $zip->addFile($f, end($filename_parts)) or die ("ERROR: Could not add file: $f");   
}
  

Комментарии:

1. Вместо explode и end() вы также можете использовать basename() функцию для получения имени файла