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

Я пытаюсь принудительно загрузить защищенный 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.

В противном случае файл загружается в порядке, поэтому я должен делать что-то неправильно с заголовками.

Есть идеи?

Related of "Загрузка .zip-файла запускает поврежденный файл php"

Эта проблема может иметь несколько причин. Возможно, ваш файл не найден или его невозможно прочитать, и, таким образом, содержимое файла является только сообщением об ошибке 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; } } 

Я поставил два пива на ошибку PHP, и сообщение об ошибке испортило ZIP-файл. Запрошенный файл, вероятно, не существует.

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

Вот решение создайте файл с именем .htaccess напишите ниже строку в том, что SetEnv no-gzip dont-vary

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

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

 <?php apache_setenv('no-gzip', 1); ini_set('zlib.output_compression', 0); 

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

 error_reporting(0); 

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