Я пытаюсь использовать 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');
Проблема здесь в том, что $zip->addFile
передаются те же два параметра.
Согласно документации :
bool ZipArchive :: addFile (строка $ filename [, string $ localname ])
имя файла
Путь к файлу, который нужно добавить.LocalName
локальное имя внутри ZIP-архива.
Это означает, что первым параметром является путь к фактическому файлу в файловой системе, а второй – путь и имя файла, которые файл будет иметь в архиве.
Когда вы укажете второй параметр, вы захотите удалить путь из него при добавлении его в zip-архив. Например, в системах на базе Unix это будет выглядеть так:
$new_filename = substr($file,strrpos($file,'/') + 1); $zip->addFile($file,$new_filename);
Я думаю, что лучший вариант:
$zip->addFile($file,basename($file));
Это просто извлекает имя файла из пути.
Это еще один метод, который я нашел для меня
$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);