2009-06-15 9 views
0

Я знаю, как сделать загрузку происходит, когда загрузка происходит, она добавляет html с веб-страницы, которая вызывает загрузку. Как отфильтровать HTML?форсирование файла скачать с php

+0

Можете ли вы уточнить, в идеале, с некоторым примером кода? Неясно, что вы подразумеваете под «вызывает загрузку» –

ответ

1

Я понимаю, что вы пытаетесь вывести некоторый поток для загрузки с PHP-страницы?

Если да, то не выводите это содержимое со страницы, содержащей HTML, а перенаправляйте на отдельную страницу php, которая выводит только загружаемый поток, при необходимости с заголовками.

+0

Это похоже на половину ответа. Это просто выше «Если вы хотите его загрузить, заставьте его скачать». – Jake

4

Если я правильно понимаю вас, это общая проблема. Я решил ее с помощью ob_start в начале моего index.php (старт/корень/файл запись) до любого вывода и встречается, загрузки я сделать следующее:

ob_end_clean(); 
    header("Content-Type: application/octet-stream; "); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: ". filesize("thefileinquestion").";"); 
    header("Content-disposition: attachment; filename=thefileinquestion"); 
    $fp = fopen(thefileinquestion, "r"); 
    while(!feof($fp)){ 
    $buffer = fread($fp, 1024); 
    echo $buffer; 
    flush(); 
    } 
    fclose($fp); 
    die(); 

Update

Команда ob_start выполняет буферизацию любого выхода (например, через echo, printf) и предотвращает отправку пользователю пользователя до фактической загрузки. ob_end_clean, чем останавливает это поведение, и позволяет снова производить прямой выход. НТН.

+3

Вы можете заменить все с '$ fp = ...' на 'fclose()' с вызовом readfile(). –

+0

Это выглядит очень аккуратной альтернативой моему раздутому коду. Будет использовать это в будущем! СПАСИБО! – merkuro

+1

1) Отправьте фактический тип носителя, а не «application/octet-stream». 2) В HTTP-заголовке нет поля заголовка Content-Transfer-Encoding. В самом деле. –

1

Удостоверьтесь, что вы не выводите дополнительные данные после завершения потока файлов. Используйте вызов для выхода() для завершения выполнения страницы после завершения потока файлов. Любые символы после закрывающего тега??> (Например, новая строка) могут также вызвать проблемы с загрузкой.

Перемещение сценария загрузки в собственный файл должно облегчить поиск проблем, поскольку это делает только одно. Чтобы избежать вывода каких-либо окончательных новых строк, в этом случае вы также можете опустить тег закрытия??>, А также в конце вашего скрипта.