Заголовок загруженного файла PHP составляет 0 байт в пазле Firefox - PullRequest
0 голосов
/ 01 июня 2019

Я проводил этот тест на своем веб-сайте уже несколько дней, и он все еще сбивает меня с толку.

У меня есть zip-файл на моем сервере. Внутри zip-файла находится один текстовый файл, содержащий фразу «это тест».

В моем файле api.php у меня есть следующий код:

<?php

$originalFileName = "test.zip";

header("content-encoding: none");
header("Content-Type: application/zip");  
header("Content-Disposition: attachment; filename=\"" . "test.zip" . "\"");
header("Content-Length: " . filesize($originalFileName));

readfile($originalFileName);

?>

Когда я захожу в файл api.php в Firefox. Он предлагает скачать «test.zip» с размером файла 128 байт.

Когда я нажимаю сохранить. Он создает файл на моем рабочем столе, но он имеет размер 0 байт и является пустым.

Если я захожу на URL, используя прямой IP-адрес, т.е. http://192.0.0.1/api.php

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

Домен находится под облачным отблеском с отключенным кэшированием и включенным режимом разработчика, поэтому он не должен быть таким особенным.

Я использовал инструменты разработчика Firefox для копирования ответов от запроса домена и запроса ip

Запрос домена - Это делает 0-байтовый пустой почтовый файл

HTTP/1.1 200 OK
Date: Sat, 01 Jun 2019 10:15:22 GMT
content-disposition: attachment; filename="test.zip"
Content-Length: 128
Content-Type: application/zip
content-encoding: none
Connection: keep-alive
X-Powered-By: PHP/7.2.16
Vary: User-Agent
Alt-Svc: h2=":443"; ma=60
CF-RAY: 4e006d0d4e615629-ORD
Server: cloudflare

UEsDBBQAAAAAADEcwU7q5x4NDgAAAA4AAAAIAAAAdGVzdC50eHR0aGlzIGlzIGEgdGVzdFBLAQIUABQAAAAAADEcwU7q5x4NDgAAAA4AAAAIAAAAAAAAAAEAIAAAAAAAAAB0ZXN0LnR4dFBLBQYAAAAAAQABADYAAAA0AAAAAAA=

Прямой IP-запрос - это делает zip-файл размером 128 байт

HTTP/1.1 200 OK
Date: Sat, 01 Jun 2019 10:15:57 GMT
content-disposition: attachment; filename="test.zip"
content-length: 128
Content-Type: application/zip
content-encoding: none
Connection: Upgrade, Keep-Alive
X-Powered-By: PHP/7.2.16
Upgrade: h2,h2c
Vary: User-Agent
Keep-Alive: timeout=5
Server: Apache

UEsDBBQAAAAAADEcwU7q5x4NDgAAAA4AAAAIAAAAdGVzdC50eHR0aGlzIGlzIGEgdGVzdFBLAQIUABQAAAAAADEcwU7q5x4NDgAAAA4AAAAIAAAAAAAAAAEAIAAAAAAAAAB0ZXN0LnR4dFBLBQYAAAAAAQABADYAAAA0AAAAAAA=

Обе полезные нагрузки ответов идентичны, кроме нескольких мелких изменений в заголовках ответов.

Такие как регистр букв и заголовки cloudflare.

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

Когда я нажимаю Ctrl + J, чтобы просмотреть историю загрузок. Это выглядит хорошо для прямой загрузки ip внизу и странного сообщения для верхнего домена.

enter image description here

У кого-нибудь есть предложения, как решить эту проблему?

1 Ответ

0 голосов
/ 01 июня 2019

Я проверил вашу проблему, возможно, изменив некоторые headers, это может решить вопрос, с моим headers Я вижу загруженный zip-файл и открываю его нормально ... дайте мне знать, если с моим кодом ваш вопрос решен ...

<?php
  $file = basename("test.zip");
  $downloads_folder = "./";
  header('Content-Description: File Transfer');
  header('Content-Type: application/octet-stream');
  header('Content-Disposition: attachment; filename="' . $file . '"');
  header('Content-Transfer-Encoding: binary');
  header('Connection: Keep-Alive');
  header('Expires: 0');
  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  header('Pragma: public');
  header('Content-Length: ' . sprintf("%u", filesize($downloads_folder . $file)));
  // Open and output file contents
  set_time_limit(0);
  $fh = fopen($downloads_folder . $file, "rb");
  while (!feof($fh)) {
    echo fgets($fh);
    ob_flush();
    flush();
  }
  fclose($fh);
  exit;
?>

РЕДАКТИРОВАТЬ: Я обнаружил, что ошибка происходит из-за HTTP/2, если у вас есть платный аккаунт, вы можете отключить его ( источник ). Используя мой код и отключив HTTP/2, вы должны решить свою проблему, или вы можете использовать SSL для решения этой проблемы, кажется, что HTTP/2 без SSL вызывает эту проблему ...

Вы можете читать другие темы, имеющие такую ​​же тему:

https://community.cloudflare.com/t/files-can-not-be-downloaded/5598

https://community.cloudflare.com/t/downloads-are-failing-timing-out/7588

https://community.cloudflare.com/t/file-download-from-website-failing/81700

https://community.cloudflare.com/t/unexpected-connection-errors/4366

Наконец предположение о вине:

https://blog.cloudflare.com/the-curious-case-of-slow-downloads/

Надеюсь, это поможет.

...