2012-02-27 2 views
3

Так у меня есть страницы загрузки, где вы щелкнули ссылку, она открывает/загрузки/загрузки/randomhashЗаголовок Location + Content Disposition

randomhash найден в БДЕ, я увеличиваю на загрузку счетчике, а затем перенаправить на фактический файл, например /uploads/2012/file.png.

Все работает, за исключением перенаправления, выполняющего то, что я хотел бы сделать. Я не знаю, почему это не работает ...

header("Location: " . $row->uri); 
    header("Content-Disposition: attachment; filename=$row->name"); 

На первой загрузке файла, он имеет соответствующий контент-распоряжения заголовка (в поджигатель), но он не запрашивает файл будет скачан (что нужно, правильно?). Есть идеи?

Response Headers:

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, public 
Connection: Keep-Alive 
Content-Disposition: attachment; filename=promotion_photo_2.jpg 
Content-Encoding: gzip 
Content-Length: 20 
Content-Type: text/html; charset=utf-8 
Date: Mon, 27 Feb 2012 01:01:22 GMT 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Keep-Alive: timeout=5, max=100 
Location: /uploads/2012/mediakitD3CF.jpg 
Pragma: no-cache 
Server: * 
Vary: Accept-Encoding 
X-Powered-By: * 
X-UA-Compatible: IE=Edge,chrome=1 
+1

вы должны перенаправить к контроллеру загрузки, который будет обрабатывать соответствующие заголовки, в настоящее время вашего просто добавив заголовок Content-Disposition для перенаправления заголовка –

ответ

4

Вы устанавливаете Content-Disposition заголовок в том же ответ, который сообщает браузеру, куда перенаправить. Мое предложение просто поток прикрепления на ответ, без редиректа

header('Content-Disposition: attachment; filename=file-to-be-downloaded.jpg'); 
header('Content-type: image/jpeg'); // or what is relevant, ie application/octet-stream 
$fn=fopen("path-to-file/file-to-be-downloaded.jpg","r"); 
fpassthru($fn); 
+2

Как это будет с файлами ~ 300mb фильмов: \? Первоначально у меня было что-то похожее на это с помощью file_get_contents, но у PHP не хватило памяти, пытаясь перегрузить 300mb содержимого в браузер ... lol. Моя другая мысль заключалась в том, что я устанавливал заголовки в моей конфигурации apache для чего-либо в загрузках, но не уверен, как это сделать (не могу сделать «RewriteCond» и Header set или FilesMatch ...) – Benno

+0

извините, вы просто положили jpg-изображение в вашем вопросе; для более крупных загрузок прочитайте 4-й комментарий здесь: http://php.net/manual/en/function.fpassthru.php или используйте http://pear.php.net/manual/en/package.http.http-download .intro.php –

+0

Вы действительно предлагаете проксировать весь файл через ваш веб-сервер с помощью fpassthru? Это не только позволит вам заблокировать вас, но, скорее всего, будет вычитаться из выделенной полосы пропускания на ваш сайт. – NoBugs

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