Заставить пользователя загружать файл в PHP

Возможный дубликат:
Принудительно загрузить файл с помощью PHP

Когда нам нужно заставить пользователя загружать файл, мы используем заголовок с несколькими параметрами/параметрами. Что делать, если я использую

header("location:test.xlsx");

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

Ответ 1

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

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

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

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

Ответ 2

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

download.php? Имя_файла = test.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);

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

Ответ 3

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

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

header('Content-Disposition: attachment');

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

Ответ 4

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

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