2012-06-07 2 views
1

Можно создать дубликат:
Forcing to download a file using PHPпользователь Force загрузить файл в PHP

Когда нам нужно, чтобы заставить пользователя загрузить файл, мы используем header with several parameters/options. Что делать, если я использую

header("location:test.xlsx"); 

Это работает :) Есть ли недостатки в использовании этого ярлыка?

ответ

0

Все, что вы делаете, перенаправляется в файл. Это ничем не отличается от того, если они пошли к нему напрямую.

Если вы пытаетесь принудительно загрузить, вам необходимо соответствующим образом установить заголовок Content-Disposition.

header('Content-Disposition: attachment'); 

Обратите внимание, что вы не можете использовать этот заголовок при перенаправлении ... этот заголовок должен быть отправлен с содержимым файла. См. Также: https://stackoverflow.com/a/3719029/362536

+2

Мне кажется, что ОП уже знает, как заставить скачать, но он интересно, почему он будет использовать вместо простого перенаправления заголовка. – Jeroen

+1

Неужели я не адресую этот пункт в первой строке моего сообщения? – Brad

0

Не каждый файл вынужден загружаться.

Если вы использовали этот заголовок() на .jpg, браузер не откроет диалоговое окно загрузки, а просто покажет изображение.

+0

правильный, но это не имеет большого значения. – confofact

1

Есть несколько недостатков этого метода:

  1. Если файл один браузер может читать, он не будет загружен (как .txt, .pdf, .html, .jpg, .png, .gif и больше), но просто отображаются в браузере

  2. Пользователи получают прямую ссылку на файл. Довольно часто, вы не хотите этого, потому что они могут дать эту ссылку другим, так что ...

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

Этот подход должен решить проблемы, упомянутые здесь

download.php? имя_файла = тест. XLSX

if isset ($_GET['filename']){ 
$filename = $_GET['filename'] 
} 
else{ 
die(); 
} 

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($file)); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($file)); 
ob_clean(); 
flush(); 
readfile($file); 

И, конечно же, не забудьте обеспечить это, так что пользователи не могут загрузить другие файлы

+0

Опять же ОП уже знает, как это сделать, но он хотел бы знать, почему он будет использовать его. – Jeroen

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