Загрузка .zip файла запускает поврежденный файл php - PullRequest
14 голосов
/ 18 января 2010

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

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

Вот код, который у меня есть:

$file='../downloads/'.$filename;
header("Content-type: application/zip;\n");
header("Content-Transfer-Encoding: Binary");
header("Content-length: ".filesize($file).";\n");
header("Content-disposition: attachment; filename=\"".basename($file)."\"");
readfile("$file");
exit();

Вот ошибка: Cannot open file: It does not appear to be a valid archive.

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

Есть идеи?

Ответы [ 5 ]

26 голосов
/ 18 января 2010

Эта проблема может иметь несколько причин. Возможно, ваш файл не найден или его нельзя прочитать, и поэтому содержимое файла - это просто сообщение об ошибке PHP. Или заголовок HTTP уже отправлен. Или у вас есть дополнительный вывод, который затем портит содержимое вашего файла.

Попробуйте добавить в ваш скрипт некоторую обработку ошибок:

$file='../downloads/'.$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 {
        header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
        header("Content-Type: application/zip");
        header("Content-Transfer-Encoding: Binary");
        header("Content-Length: ".filesize($file));
        header("Content-Disposition: attachment; filename=\"".basename($file)."\"");
        readfile($file);
        exit;
    }
}
8 голосов
/ 18 января 2010

Бьюсь об заклад, два раза, что ошибка PHP происходит, и сообщение об ошибке портит ZIP-файл. Запрошенный файл, вероятно, не существует.

Откройте ZIP-файл с помощью блокнота или аналогичного текстового редактора и выясните, в чем дело.

1 голос
/ 03 мая 2016

Поздний ответ, но может быть полезно для пользователей, которые не могут заставить force download работать.
Добавьте следующее вверху вашего php сценария

<?php
apache_setenv('no-gzip', 1);
ini_set('zlib.output_compression', 0);
1 голос
/ 12 мая 2011

Вот решение создать файл с именем .htaccess напишите ниже строку в этом SetEnv no-gzip не меняет

загрузить файл на ваш сайт. Если у вас уже есть файл, внесите вышеуказанные изменения в

0 голосов
/ 15 марта 2016

попробуйте это, чтобы найти, если есть какая-либо ошибка

error_reporting(0);

Не печатайте ничего, прежде чем писать заголовки; Запустите ob_start () для вашего скрипта, после того как код отредактирует ваши заголовки, а затем ob_flush () и ob_clean ()

...