Я работаю инструктором лаборатории и стараюсь, чтобы мои ученики не могли загружать стартовые файлы раньше, сохраняя файлы выше веб-корня и заставляя их входить в систему (аутентифицироваться через LDAP университета), проверяет, что он прошел релиз затем отправляет их файл с помощью файла readfile. К сожалению, все файлы, которые я отправляю, повреждены.
Мой код:
if (file_exists($path)) { //header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($path)); //header('Content-Transfer-Encoding: binary'); header('Expires:' . date('r', 0)); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); //header('Pragma: public'); header('Content-Length: ' . filesize($path)); //ob_clean(); //flush(); readfile($path); exit(0); }
Я даже попробовал отправить простой текст, который также не передавался правильно, только что закончился тарабарщиной.
Редактировать:
Извините, что я ошибся в определении того, что я уже пробовал. Я попытался отправить простой текстовый файл (попытка изучить pdf-файл в блокноте, ищущий предупреждения PHP, немного).
Я отправил файл только с содержимым. This is plain text
и результат был чистой тарабарщиной. В основном непечатаемые символы. 1f 8b 08 00 00 00 00 00 00 03 0b c9 c8 2c 56 00 a2 82 9c 00
Обновить:
Отключил gzipping на одном из серверов, и файлы все еще были повреждены. удалил ob_clean(); flush()
ob_clean(); flush()
и текстовые файлы начали проходить чисто (не могу поверить, что вы читаете в Интернете: /).
Почтовые файлы все еще были повреждены, но мои PDF-файлы теперь были доступны для чтения. Выглядел еще немного, и кажется, что в начале файла добавлена дополнительная новая строка. Оглядываясь на текстовый файл, у него есть дополнительная новая строка спереди, а последний символ отсутствует. Как и ожидалось, добавление +1
в заголовок Content-Length позволяет последнему персонажу пройти, все еще ищу, откуда начинается эта префиксная линия. Кроме того, если я прокомментирую readfile
я получаю файл с только CRLF ( 0d0a
).
Структура обычно «обертывает» содержимое с контроллера с представлением, а затем с макетом, но оба устанавливаются в пустые файлы, а головной контроллер проверяет, что они пустые, а затем пропускает строку для эха генерируемого HTML. Даже тогда exit(0)
должен гарантировать, что после передачи будут вызваны только деструкторы. Я проверил это, разместив выражения эха в макете и просмотре и соответственно увеличив размер контента, и этот текст не заканчивается в загруженном файле, поэтому я уверен, что новая строка не идет оттуда.
Убедитесь, что скрипт PHP не содержит пустых строк из тегов <?php ?>
. В общем, убедитесь, что никакой другой материал не эхом, а файл.
Было бы очень полезно, если вы разместите итоговое содержимое файла здесь, пожалуйста. Попробуйте простой текстовый текстовый файл.