Пользователь на моем сайте может скачивать файлы. Иногда эти файлы довольно велики, и я бы хотел, чтобы пользователи видели индикатор загрузки в своих браузерах.
Я использую следующий код, чтобы дать пользователю файл:
header('Content-Type: text/xml');
header('Content-Disposition: attachment; filename='.$fileName);
header('Pragma: no-cache');
header('Content-Transfer-Encoding: binary');
header('Pragma: public');
header('Content-Length: '.filesize($fullFileName));
header("Content-Description: File Transfer");
$fileHandler = fopen($fullFileName, 'r');
while(!feof($fileHandler)){
echo fread($fileHandler, 2048);
}
fclose($fileHandler);
Когда я запускаю этот скрипт, браузер (FireFox) зависает на некоторое время, я вижу загрузочный цветовой круг и только после появления файла диалога сохранения / открытия. Когда я нажимаю кнопку «Сохранить», файл почти сразу загружается на мой компьютер (размер файла довольно большой — 50 Мб).
Я хочу иметь систему загрузки, как на этом сайт. Диалог для сохранения / opean появляется сразу после нажатия на любую ссылку. И после вы можете увидеть прогресс загрузки в вашем браузере.
Есть ли специальные заголовки для отображения индикатора выполнения в браузере? Как я должен изменить свой код?
Я использую приведенный ниже код, и в Firefox он дает мне время загрузки и прогресс:
// send headers first
header('Content-type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-disposition: attachment; filename='.$FileName);
header("Content-Length: ".filesize($Path));
// then use an easy way to flush and end all output buffers
while (@ob_end_flush());
// flush file
readfile($Path);
Это должно работать, если вы укажете Content-Length
правильно. Единственное, что я нахожу слегка странным в вашем коде, это Content-Type: text/xml
заголовок. Обратите внимание, что я использую Content-type: application/octet-stream
,
Других решений пока нет …