zip и загружать файлы, используя php

Я пытаюсь zip и загружать файлы из папки с именем «upload». Zip-файл загружается, но я не могу его открыть (извлечь). Я получаю сообщение об ошибке «Архив находится в неизвестном формате или поврежден».

Я нашел следующий код, чтобы застегнуть папку.

<?php $files = "upload/".array('Dear GP.docx','ecommerce.doc'); $zipname = 'filename.zip'; $zip = new ZipArchive; $zip->open($zipname, ZipArchive::CREATE); foreach ($files as $file) { $zip->addFile($file); } $zip->close(); header('Content-Type: application/zip'); header('Content-disposition: attachment; filename=filename.zip'); header('Content-Length: ' . filesize($zipfilename)); readfile($zipname); ?> 

Solutions Collecting From Web of "zip и загружать файлы, используя php"

Спасибо за ваши ответы.

 <?php $files = array('Dear GP.docx','ecommerce.doc'); # create new zip opbject $zip = new ZipArchive(); # create a temp file & open it $tmp_file = tempnam('.',''); $zip->open($tmp_file, ZipArchive::CREATE); # loop through each file foreach($files as $file){ # download file $download_file = file_get_contents($file); #add it to the zip $zip->addFromString(basename($file),$download_file); } # close zip $zip->close(); # send the file to the browser as a download header('Content-disposition: attachment; filename=Resumes.zip'); header('Content-type: application/zip'); readfile($tmp_file); ?> 

Я потратил более 6 часов на загрузку zip-файлов на моем mac (localhost). Хотя файл загружался, я не мог разархивировать их (получая файлы cpgz). По-видимому, ни одно из решений, упомянутых в переполнении стека (вокруг множества вопросов по загрузке zip-файла), не работало. Наконец, после проб и ошибок, я обнаружил, что работает следующий код:

Никто из людей не ответил ранее о ob_start () и где именно вы должны его поместить. Во всяком случае, это не было ответом – вам нужно использовать эти три строки выше ob_start ().

 $file=$zippath.$filename; if (headers_sent()) { echo 'HTTP header already sent'; } else { if (!is_file($file)) { header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found'); echo 'File not found'; } else if (!is_readable($file)) { header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden'); echo 'File not readable'; } else { while (ob_get_level()) { ob_end_clean(); } ob_start(); header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); header("Content-Type: application/zip"); header("Content-Transfer-Encoding: Binary"); header("Content-Length: ".filesize($file)); header('Pragma: no-cache'); header("Content-Disposition: attachment; filename=\"".basename($file)."\""); ob_flush(); ob_clean(); readfile($file); exit; } } 

Пожалуйста, используйте ниже код вместо $ zip-> addFile ($ file);

 <?php $zip->addFile($file_path, $filename); ?> 
 $files = "upload/".array('Dear GP.docx','ecommerce.doc'); 

Должно быть:

 $files = array('upload/Dear GP.docx','upload/ecommerce.doc'); 

Если у вас все еще есть проблемы, вы должны проверить, есть ли у вас разрешение на запись в текущий каталог. Вы можете проверить возвращаемое значение close() чтобы проверить, действительно ли файл был записан.

 $res = $zip->close(); var_dump($res); 

Результат должен быть bool(true) если запись была успешной.

Похоже, у вас есть неправильное имя var в вызове filesize() :

 header('Content-Length: ' . filesize($zipfilename)); 

Должно быть, должно быть:

 header('Content-Length: ' . filesize($zipname)); 

Вы также можете добавить дополнительную проверку, чтобы проверить, существуют ли файлы, которые вы добавляете в zip, и перед отправкой проверьте, существует ли почтовый файл.

Изменить: включить ошибки отображения, чтобы помочь вам отлаживать локально:

 ini_set('display_errors', 1); error_reporting(E_ALL); 

Ответ хороший, но добавьте эти строки перед заголовком. Zip-файл открыт во всех программах zip (winzip, winrar и т. Д.)

 if (headers_sent()) { // HTTP header has already been sent return false; } // clean buffer(s) while (ob_get_level() > 0) { ob_end_clean(); } 
  $zip = new ZipArchive; if ($zip->open('assets/myzip.zip', ZipArchive::CREATE)) { $zip->addFile('folder/bootstrap.js', 'bootstrap.js'); $zip->addFile('folder/bootstrap.min.js', 'bootstrap.min.js'); $zip->close(); echo 'Archive created!'; header('Content-disposition: attachment; filename=files.zip'); header('Content-type: application/zip'); readfile($tmp_file); } else { echo 'Failed!'; } 

Я получил этот код для загрузки файлов из папки.