我一直在开发一个新的Web应用程序,它依赖于 Amazon S3 服务器作为存储系统,而 Codeiginter 作为PHP框架。
我需要在单击链接时强制下载文件。原始网址如下所示:
http://www.our-web.com/download/do/1.jpg
生成Amazon S3服务器上实际文件的临时签名URL,如下所示:
http://main_bucket.s3.amazonaws.com/post/1/1.jpg?AWSAccessKeyId=AKIAJEOQKYPKC3CCU5RA&Expires=1305395426&Signature=iuzCdA22gImLK192%2BMAhk8OkAY8%3D
我需要在用户点击链接后立即从真正的亚马逊网址开始下载文件。
我现在有两种方法可以这样做:
redirect()
打开文件而不下载;或将此标题更改为标题:
header('Content-type: application/force-download');
header('Content-Disposition: attachment; filename=' . $file_name);
header('Content-Transfer-Encoding: binary');
header('Expires: 4000');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($generated_file));
readfile($generated_file);
不幸的是,这两种方式对我没有帮助。第二种方法导致下载来自我的网站,而不是直接来自亚马逊。
如何强制文件直接从Amazon S3服务器下载,而不是从我的网站下载?
答案 0 :(得分:30)
您只需在S3中的文件上设置正确的标题,以强制浏览器下载而不是打开文件。设置这些:
Content-Disposition: attachment; filename=FILENAME.EXT
Content-Type: application/octet-stream
将文件上传到S3时需要设置它们。使用php SDK,您可以使用create_object
。
或者您可以在S3中使用'change_content_type'或copying the file to itself上传并设置正确的标题后进行设置。
答案 1 :(得分:9)
参加派对的时间比较晚,但是经常会有一个文件,你不想在存储时决定如何使用它。您希望能够将文件存储一次,然后存储在可能将文件或显示嵌入浏览器的一个区域中,并在另一个区域中使用户能够下载相同的文件。
幸运的是,您可以通过在请求网址中提供覆盖参数来实现。它仅适用于签名请求,但幸运的是,您已经这样做了。
如果你添加一个像&request-content-type="application/force-download"
这样的参数就可以了。
查看S3 GET Object文档的请求参数部分: http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html
答案 2 :(得分:8)
问题是关于以编程方式设置此方法,但是要通过AWS控制台手动设置:
答案 3 :(得分:0)
如果您的S3网站位于CloudFront后面,请不要忘记在再次尝试之前使文件无效!这将清除缓存的文件。
您可以转到以下页面进入失效页面:
Cloudfront -> Distribution Settings -> Invalidation
然后输入文件的路径。
使文件失效需要一些时间。对于我的文件,它花了5分钟。
答案 4 :(得分:-4)
您无法告诉浏览器如何处理远程文件。通过重定向到亚马逊,您告诉浏览器在那里开始新的请求。您无法控制该请求。
我能想到的唯一解决方案是将图像打包成zip文件或类似文件。当然,这增加了另一种(可能令人讨厌的)复杂形式。