2014-09-23 3 views
0

Пользователь на моем сайте может скачивать файлы. Иногда эти файлы довольно большие, и я бы хотел, чтобы пользователи просматривали панель выполнения загрузки в своих браузерах.PHP файл загрузки: показать прогресс в браузере

Я использую следующий код, чтобы дать пользователю файл:

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 Мб).

Я хочу иметь систему загрузки, например, на этом site. Диалог для сохранения/opean появляется сразу, когда вы нажимаете на какие-либо ссылки. И после того, как вы сможете увидеть ход выполнения в своем браузере.

Есть ли специальные заголовки для отображения индикатора выполнения в браузере? Как мне изменить код?

+0

Я использую Chrome, и я не вижу ничего особенного на этом сайте в отношении загрузки. Нет ничего, заголовок, который вы можете отправить, чтобы браузер отображал какой-то хороший индикатор выполнения загрузки. Я думаю, что проблема здесь в том, что ваш компьютер более или менее, ничто другое. –

+0

@ N.B.I не понимаю, почему есть промежуток времени на моем сайте между моментом, когда вы нажимаете на ссылку и видите диалог «сохранить файл»? Я считаю, что что-то не так с кодом. Похоже, браузер ждет до момента, когда WHOLE-файл будет передан перед отображением диалогового окна. – Tamara

+0

У меня были проблемы с firefox, когда я использовал его, и он загрузил весь файл, прежде чем уведомить меня о том, что он запущен. Я сомневаюсь, что это связано с заголовками (это не может быть - не имеет смысла), это либо на вашем компьютере (полный раздел hdd, либо просто медленный/старый hdd), либо механизм загрузки Firefox (опять же, не знаю, потому что Я не использую его так сильно). –

ответ

0

Я использую ниже код, и в 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.

Смежные вопросы