отправить zip-файл в браузер / принудительно загрузить - PullRequest
14 голосов
/ 19 сентября 2011

я создал с помощью php zip (http://php.net/manual/de/book.zip.php) zip-файл

Теперь я должен отправить его в браузер / принудительно загрузить его.

Ответы [ 4 ]

36 голосов
/ 19 сентября 2011
<?php
    // or however you get the path
    $yourfile = "/path/to/some_file.zip";

    $file_name = basename($yourfile);

    header("Content-Type: application/zip");
    header("Content-Disposition: attachment; filename=$file_name");
    header("Content-Length: " . filesize($yourfile));

    readfile($yourfile);
    exit;
?>
5 голосов
/ 19 сентября 2011

Установите заголовки типа содержимого, длины содержимого и расположения содержимого, затем выведите файл.

header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-Length: '.filesize($filepath) );
readfile($filepath);

Установка Content-Disposition: attachment предложит браузеру загрузить файл, а не отображать его напрямую.

2 голосов
/ 15 марта 2017

Если у вас уже есть ваш ZIP на сервере, и если этот ZIP доступен через Apache в HTTP или HTTPS, то следует перенаправить в этот файл вместо того, чтобы «читать» его с помощью PHP. 1003 *

Это гораздо более эффективно , так как вы не используете PHP, поэтому нет необходимости в ЦП или ОЗУ , и загрузка будет быстрее, поскольку не требуется чтение / запись с помощью PHP, только прямая загрузка. Давайте сделаем всю работу Apache!

Так что хорошей функцией может быть:

if($is_reachable){
    $file = $relative_path . $filename; // Or $full_http_link
    header('Location: '.$file, true, 302);
}
if(!$is_reachable){
    $file = $relative_path . $filename; // Or $absolute_path.$filename
    $size = filesize($filename); // The way to avoid corrupted ZIP
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename=' . $filename);
    header('Content-Length: ' . $size);
    // Clean before! In order to avoid 500 error
    ob_end_clean();
    flush();
    readfile($file);
}
exit(); // Or not, depending on what you need

Я надеюсь, что это поможет.

2 голосов
/ 04 февраля 2013

Вам нужно сделать это следующим образом, иначе ваш почтовый индекс будет поврежден:

$size = filesize($yourfile);
header("Content-Length: \".$size.\"");

Таким образом, заголовок с длиной содержимого должен иметь настоящую строку, а размер файла возвращает и целое число.

...