2013-11-23 3 views
6

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

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

<?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); 
?> 
+0

Проблема, вероятно, связана с '$ files =" upload/". Array ('Dear GP.docx', 'ecommerce.doc');'. Попробуйте отобразить ошибки и проверить ошибки PHP.Вы пытаетесь передать массив в виде строки. –

ответ

20

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

<?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); 
?> 
+0

Это было очень полезно, спасибо! –

+0

Спасибо! работает отлично! –

+0

Измените часть ответа, задававшего новый вопрос. [Пожалуйста, используйте ответы исключительно для ответа на вопрос] (// meta.stackoverflow.com/q/92107). Если у вас есть НОВЫЙ вопрос, пожалуйста, спросите его, нажав кнопку [Ask Question] (// stackoverflow.com/questions/ask). Включите ссылку на этот вопрос, если это поможет обеспечить контекст. – Mogsdad

0

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

<?php 
$zip->addFile($file_path, $filename); 
?> 
+0

Это не проблема. '$ filename' является [необязательным] (http://www.php.net/manual/en/ziparchive.addfile.php) параметром –

+0

ok. Я создаю zip-файл, используя имя файла, поэтому я предлагаю путь к файлу и имя файла как вариант. –

0
$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), если запись была успешной.

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

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

, вероятно, следует:

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

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

Edit: Включите ошибки отображения для отладки локально:

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

я провел более 6 часов на этом ЗАГРУЖАЯ почтовые файлы на мой макинтош (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; 
    } 
} 
+0

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

0

Ответ хороший, но добавьте эти строки перед заголовком. 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(); 
    } 
0
$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!'; 
     } 

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

Смежные вопросы