Заставить пользователя загружать файл в 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, браузер не откроет диалоговое окно загрузки, а просто покажет изображение.