PHP создает почтовые индексы без пути к файлам внутри почтового индекса - PullRequest
47 голосов
/ 22 октября 2010

Я пытаюсь использовать 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');

Ответы [ 3 ]

123 голосов
/ 22 октября 2010

Проблема здесь в том, что $zip->addFile передаются те же два параметра.

Согласно документации :

bool ZipArchive :: addFile (строка $ filename [, строка $ localname ])

filename
Путь к файлу

локальное имя
локальное имя внутри ZIP-архива.

Это означает, что первым параметром является путь к фактическому файлу в файловой системе.а второй - это путь и имя файла, которые файл будет иметь в архиве.

Когда вы укажете второй параметр, вы захотите убрать из него путь при добавлении его в zip-архив.Например, в системах на основе Unix это будет выглядеть так:

$new_filename = substr($file,strrpos($file,'/') + 1);
$zip->addFile($file,$new_filename);
42 голосов
/ 28 апреля 2015

Я думаю, что лучшим вариантом будет:

$zip->addFile($file,basename($file));

, который просто извлекает имя файла из пути.

0 голосов
/ 26 февраля 2017

Это еще один метод, который я нашел, который работал для меня

$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);
...