【问题标题】:Header Location + Content Disposition标题位置 + 内容配置
【发布时间】:2012-03-16 13:29:23
【问题描述】:

所以我有一个下载页面,你点击一个链接,它会打开 /downloads/download/randomhash

在数据库中找到随机哈希,我增加一个下载计数器,然后重定向到实际文件,例如/uploads/2012/file.png.

一切正常,除了重定向做我想做的事。我不确定为什么它不起作用...

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

在第一次加载文件时,它具有适当的 content-disposition 标头(在 firebug 中),但它不会提示下载文件(它应该下载,对吗??)。有什么想法吗?

响应标头:

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

【问题讨论】:

  • 您应该重定向到将处理适当标头的下载控制器,目前您只需将 Content-Disposition 标头添加到重定向标头

标签: php http-headers content-disposition


【解决方案1】:

您在相同的响应中设置 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);

【讨论】:

  • 300mb 的电影文件如何处理:\?我最初使用 file_get_contents 有类似的东西,但是 PHP 内存不足,试图将 300mb 的内容缓冲到浏览器......哈哈。我的另一个想法是在我的 apache 配置中为上传中的任何内容有条件地设置标头,但不确定如何执行此操作(不能执行“RewriteCond”和标头集或 FilesMatch ...)
  • 对不起,你只是在你的问题中放了一张 jpg 图像;如需更大的下载,请阅读此处的第 4 条评论:php.net/manual/en/function.fpassthru.php 或使用 pear.php.net/manual/en/package.http.http-download.intro.php
  • 您真的建议使用 fpassthru 通过您的网络服务器代理整个文件?这不仅可能会阻止您,而且可能会从分配给您网站的带宽中扣除。
  • 带宽可能是个问题。当您使用“匿名”名称将文件存储到 Amazon AWS 并在数据库中具有原始文件名时。当您想提供下载时,应将用户重定向到亚马逊。 fpassthrough 或类似的人会将文件从亚马逊下载到您的网络服务器,然后在第二步将其发送到客户端。
  • @NoBugs 和 Bernard 你的 cmets 与这个问题无关:他在问如何让他的用户下载存储在他的服务器存储中的文件;文件的 URI 将是本地路径。 fpassthru 在这里所做的只是将文件描述符的读取器通过管道传输到 http 连接中。如果资源存储在第三方位置,您将需要重定向到那里的控制器,或者在 Web 服务器中注入 http 标头,以便能够设置 Content-Disposition,因为在重定向 http 响应中设置它会零效应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多