Php создание zips без пути к файлам внутри zip
Я пытаюсь использовать php для создания zip файла (который он делает - взятый с этой страницы - http://davidwalsh.name/create-zip-php), однако внутри zip файла все имена папок в самом файле.
Возможно ли иметь только файл внутри zip минус все папки?
Здесь мой код:
function create_zip($files = array(), $destination = '', $overwrite = true) {
if(file_exists($destination) && !$overwrite) { return false; };
$valid_files = array();
if(is_array($files)) {
foreach($files as $file) {
if(file_exists($file)) {
$valid_files[] = $file;
};
};
};
if(count($valid_files)) {
$zip = new ZipArchive();
if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
return false;
};
foreach($valid_files as $file) {
$zip->addFile($file,$file);
};
$zip->close();
return file_exists($destination);
} else {
return false;
};
};
$files_to_zip = array('/media/138/file_01.jpg','/media/138/file_01.jpg','/media/138/file_01.jpg');
$result = create_zip($files_to_zip,'/...full_site_path.../downloads/138/138_files.zip');
Ответы
Ответ 1
Проблема заключается в том, что $zip->addFile
передаются те же два параметра.
Согласно документации:
bool ZipArchive:: addFile (строка $имя_файла [, строка $localname])
имя_файла
Путь к добавляемому файлу.
LocalName
локальное имя внутри ZIP-архива.
Это означает, что первым параметром является путь к фактическому файлу в файловой системе, а второй - путь и имя файла, которые файл будет иметь в архиве.
При поставке второго параметра вы хотите удалить путь из него при добавлении его в zip-архив. Например, в системах на базе Unix это будет выглядеть так:
$new_filename = substr($file,strrpos($file,'/') + 1);
$zip->addFile($file,$new_filename);
Ответ 2
Я думаю, что лучший вариант:
$zip->addFile($file,basename($file));
Что просто извлекает имя файла из пути.
Ответ 3
Это просто еще один метод, который я нашел для меня.
$zipname = 'file.zip';
$zip = new ZipArchive();
$tmp_file = tempnam('.','');
$zip->open($tmp_file, ZipArchive::CREATE);
$download_file = file_get_contents($file);
$zip->addFromString(basename($file),$download_file);
$zip->close();
header('Content-disposition: attachment; filename='.$zipname);
header('Content-type: application/zip');
readfile($tmp_file);