Я пытаюсь принудительно загрузить защищенный 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.
В противном случае файл загружается в порядке, поэтому я должен делать что-то неправильно с заголовками.
Есть идеи?
Эта проблема может иметь несколько причин. Возможно, ваш файл не найден или его невозможно прочитать, и, таким образом, содержимое файла является только сообщением об ошибке 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 ()