我一直在开发一个新的Web应用程序,它依赖于Amazon S3服务器作为存储系统,Codeiginter作为PHP框架。
我需要在单击链接时强制下载文件。原始URL如下所示:http://www.our-web.com/download/do/1.jpg
它生成一个指向AmazonS 3服务器上实际文件的临时签名URL,如下所示:http://main_bucket.s3.amazonaws.com/post/1/1.jpg?AWSAccessKeyId=AKIAJEOQKYPKC3CCU5RA&Expires=1305395426&Signature=iuzCdA22gImLK192%2BMAhk8OkAY8%3D
我需要使文件开始下载从真实的的亚马逊网址它尽快用户点击链接。
我现在有两个办法:
1.使用redirect()
将打开文件而不是下载它;或
1.将标题更改为以下代码:
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服务器下载,而不是从我的网站下载?
6条答案
按热度按时间a14dhokn1#
您只需要在S3中设置正确的文件头,以强制浏览器下载而不是打开文件。
将文件上传到S3时,需要设置这些参数。对于php SDK,需要使用
create_object
。或者,您可以在上载后使用“change_content_type”或通过在S3中将文件复制到其自身并设置正确的头来设置这些属性。
0md85ypi2#
有点晚了党,但往往与一个文件,你不希望有决定在存储时间如何使用它。你希望能够存储文件一次,然后在一个区域可能嵌入文件或显示在浏览器中,并在另一个区域使用户能够下载相同的文件。
幸运的是,您可以通过在请求url中提供覆盖参数来实现这一点。它只适用于签名的请求,但谢天谢地,您已经在这样做了。
如果您添加一个类似
&request-content-type="application/force-download"
的参数,就可以实现这个目的。查看S3 GET对象文档的请求参数部分:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html
8ftvxx2r3#
问题是如何通过编程方式进行设置,但要通过AWS控制台手动进行设置:
0mkxixxg4#
如果您的S3网站在CloudFront之后,不要忘记在重试之前使文件无效!这将清除缓存的文件。
您可以移至下列网址,以取得无效验证页面:
然后输入文件的路径。
使文件无效需要一些时间。对于我的文件,花了5分钟。
kupeojn65#
您应该使用
$s3->getObject()
的ResponseContentDisposition
参数来设定回应的内容配置。您可以使用此参数来胁迫下载档案。jutyujz06#
你不能告诉浏览器如何处理一个远程文件。通过重定向到amazon,你告诉浏览器在那里开始一个新的请求。你对那个请求没有任何控制权。
我能想到的唯一解决方案是将图像打包成zip文件或类似的文件。当然,这增加了另一种(可能很烦人)形式的复杂性。