2013-12-22 2 views
3

Я бы хотел, чтобы пользователь загрузил файл, когда он нажимает на 'скачать этот файл' link.Как заставить скачать файл с помощью PHP?

Использование: Пользователь нажимает на ссылку, а веб-приложение создает файл и «подталкивает» его как загрузку.

У меня есть следующий код PHP. Хотя файл генерируется правильно на сервере, он не загружается (и не показывает диалоговое окно загрузки).

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 
header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"".$filename."\""); 
header("Content-Transfer-Encoding: binary"); 
readfile('file.zip'); 

Я попытался добавить следующее, но он не работает:

header("Location: file.zip"); // not working 

Хотя, я нашел решение JavaScript (который работает), пытаясь следующий редирект:

window.location.href = 'file.zip'; 

Проблема заключается в том, что выполнение JavaScript выше пытается «выгрузить» текущее окно/форму, которая не будет работать для меня в этой ситуации.

Есть ли решение для этого, используя только PHP для «принудительного» файла (в данном случае «file.zip») для загрузки?

+0

'Content-Transfer-Encoding' не является HTTP-заголовком. Просто говорю. – DaSourcerer

ответ

2
$file_url = 'http://www.myremoteserver.com/file.exe'; 
header('Content-Type: application/octet-stream'); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\""); 
readfile($file_url); // do the double-download-dance (dirty but worky) 

Также убедитесь, чтобы добавить соответствующий тип контента на основе вашего приложения файл/зип, приложения/PDF и т.д. - но только если вы не хотите, чтобы вызвать сохранение, в диалоговом окне.

+0

Спасибо, но это не работает. – Gandalf

1

У меня есть два примера, которые я использую, и работа, ну три фактически.

HTML

<a href="save_file_1.php">Click here</a> 

PHP (save_file_1.php)

<?php 
$file = 'example.zip'; 

if(!file) 
{ 
    die('file not found'); 
} 
else 
{ 
     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, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($file)); 
     ob_clean(); 
     flush(); 
     readfile($file); 
     exit; 
} 
?> 

И второй, который является коротким и сладким.

диалоговое окно предложит пользователю сохранить на ...

HTML

<a href="save_file_2.php">Click here</a> 

PHP (save_file_2.php)

<?php 
header('Content-Disposition: attachment; filename=example.zip'); 
readfile("example.zip"); 
?> 

И вариант примера чуть выше :

<?php 
$file = "example.zip"; 
header("Content-Disposition: attachment; filename=$file"); 
readfile("$file"); 
?> 

Все, что я тестировал и работал (для меня) на сервере, использующем PHP версии 5.4.20.

+0

Спасибо, это создает файл (как мой пример), но по-прежнему пытается «разгрузить» текущую форму. Это означает, что Chrome или Firefox (или любой браузер) покажут ... «Вы действительно хотите покинуть эту страницу?» оповещения. – Gandalf

+0

Добро пожаловать.Мне нужно будет увидеть вашу форму или HTML, затем (весь/полный код), включая любой другой PHP-код, который может использоваться вместе с вашим текущим/показанным кодом. @Gandalf Если вы используете JS также в сочетании с моим/вашим кодом, то это может быть ошибка. Что-то в вашем нынешнем использовании кода вызывает это. –

+0

Приложение: Я также использую Firefox (последняя версия), и он не генерировал это сообщение, поэтому это явно связано с вашим нераскрытым кодом/HTML. @Gandalf –

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