Код PHP/Apache для загрузки файла с хоста - раньше работал - теперь не работает как с Chrome, так и с Firefox. ⇐ Php
Код PHP/Apache для загрузки файла с хоста - раньше работал - теперь не работает как с Chrome, так и с Firefox.
Запуск PHP/Apache на локальном хосте. Да, очень старые версии (Apache/2.4.10 (Win32) PHP/5.4.34), но код работает уже много лет. Я полагался на модуль Xsendfile Apache, но он молча провалился. Изменено использование явных вызовов header() и эхо-содержимого. Это приводит к тому, что Chrome говорит: «Не удалось завершить загрузку». А Firefox говорит: «Не удалось сохранить example.zip.part, поскольку исходный файл не удалось прочитать. Повторите попытку позже или обратитесь к администратору сервера."
Chrome 117.0.5938.89 (официальная сборка) (64-разрядная версия), Firefox 117.0.1 (64-разрядная версия) в Windows 10.
Вот код:
if (false && in_array('mod_xsendfile', apache_get_modules())) { // Несмотря на документацию в https://tn123.org/mod_xsendfile/beta/, простое кодирование // путь с urlencode приводит к тому, что X-Sendfile вызывает внутреннюю ошибку сервера. // См. http://stackoverflow.com/questions/2676 ... ile-expect $encoded = str_replace('%2F', '/', rawurlencode($pathname)); заголовок("Тип контента: $mime_info"); если ($attachment === true) { $dispo = 'вложение'; } еще { $dispo = 'встроенный'; } header("Content-Disposition: $dispo; filename=\"$basename\""); // xsendfile заставляет Apache генерировать заголовки и тело для наилучшего поведения при загрузке. header("X-SendFile: $encoded"); } еще { // По крайней мере, в одном сообщении где-то говорилось, что это хорошие заголовки для загрузки вручную заголовок("Прагма: общедоступный"); заголовок("Срок действия истекает: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: Private", false); // требуется для некоторых браузеров заголовок("Тип контента: $mime_info"); если ($attachment === true) { header("Content-Disposition: Attachment; filename=\"$basename\""); } header("Content-Length: " .jpg("$pathname"); ob_clean(); румянец(); $data = file_get_contents("$pathname"); эхо $данные; } Я просто добавил «ложный &&» в «if», чтобы заставить его не использовать модуль Xsendfile. И, как я уже сказал, это изменило поведение с тихого сбоя в Chrome (в пользовательском интерфейсе нет ничего, указывающего на то, что была предпринята попытка загрузки) на начало загрузки (скажем, 0/32,1 КБ, осталось 38 секунд на некоторое время), затем, наконец, «Не удалось завершить загрузку».
Я в полном замешательстве! Этот же код раньше работал на моем ПК, загружая тот же файл (с использованием модуля Xsendfile). Обычно я передаю $attachment = true; но также попробовал это сделать с $attachment = false, без каких-либо улучшений.
Как отмечается в комментариях, прагмы и элементы управления кешем были просто скопированы из какого-то поста. Он работает над общедоступным сайтом последние 12 лет или около того...
Запуск PHP/Apache на локальном хосте. Да, очень старые версии (Apache/2.4.10 (Win32) PHP/5.4.34), но код работает уже много лет. Я полагался на модуль Xsendfile Apache, но он молча провалился. Изменено использование явных вызовов header() и эхо-содержимого. Это приводит к тому, что Chrome говорит: «Не удалось завершить загрузку». А Firefox говорит: «Не удалось сохранить example.zip.part, поскольку исходный файл не удалось прочитать. Повторите попытку позже или обратитесь к администратору сервера."
Chrome 117.0.5938.89 (официальная сборка) (64-разрядная версия), Firefox 117.0.1 (64-разрядная версия) в Windows 10.
Вот код:
if (false && in_array('mod_xsendfile', apache_get_modules())) { // Несмотря на документацию в https://tn123.org/mod_xsendfile/beta/, простое кодирование // путь с urlencode приводит к тому, что X-Sendfile вызывает внутреннюю ошибку сервера. // См. http://stackoverflow.com/questions/2676 ... ile-expect $encoded = str_replace('%2F', '/', rawurlencode($pathname)); заголовок("Тип контента: $mime_info"); если ($attachment === true) { $dispo = 'вложение'; } еще { $dispo = 'встроенный'; } header("Content-Disposition: $dispo; filename=\"$basename\""); // xsendfile заставляет Apache генерировать заголовки и тело для наилучшего поведения при загрузке. header("X-SendFile: $encoded"); } еще { // По крайней мере, в одном сообщении где-то говорилось, что это хорошие заголовки для загрузки вручную заголовок("Прагма: общедоступный"); заголовок("Срок действия истекает: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: Private", false); // требуется для некоторых браузеров заголовок("Тип контента: $mime_info"); если ($attachment === true) { header("Content-Disposition: Attachment; filename=\"$basename\""); } header("Content-Length: " .jpg("$pathname"); ob_clean(); румянец(); $data = file_get_contents("$pathname"); эхо $данные; } Я просто добавил «ложный &&» в «if», чтобы заставить его не использовать модуль Xsendfile. И, как я уже сказал, это изменило поведение с тихого сбоя в Chrome (в пользовательском интерфейсе нет ничего, указывающего на то, что была предпринята попытка загрузки) на начало загрузки (скажем, 0/32,1 КБ, осталось 38 секунд на некоторое время), затем, наконец, «Не удалось завершить загрузку».
Я в полном замешательстве! Этот же код раньше работал на моем ПК, загружая тот же файл (с использованием модуля Xsendfile). Обычно я передаю $attachment = true; но также попробовал это сделать с $attachment = false, без каких-либо улучшений.
Как отмечается в комментариях, прагмы и элементы управления кешем были просто скопированы из какого-то поста. Он работает над общедоступным сайтом последние 12 лет или около того...
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение