codeigniter 强制从s3 amazon服务器下载

olqngx59  于 2022-12-07  发布在  其他
关注(0)|答案(6)|浏览(128)

我一直在开发一个新的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服务器下载,而不是从我的网站下载?

a14dhokn

a14dhokn1#

您只需要在S3中设置正确的文件头,以强制浏览器下载而不是打开文件。

Content-Disposition: attachment; filename=FILENAME.EXT
Content-Type: application/octet-stream

将文件上传到S3时,需要设置这些参数。对于php SDK,需要使用create_object
或者,您可以在上载后使用“change_content_type”或通过在S3中将文件复制到其自身并设置正确的头来设置这些属性。

0md85ypi

0md85ypi2#

有点晚了党,但往往与一个文件,你不希望有决定在存储时间如何使用它。你希望能够存储文件一次,然后在一个区域可能嵌入文件或显示在浏览器中,并在另一个区域使用户能够下载相同的文件。
幸运的是,您可以通过在请求url中提供覆盖参数来实现这一点。它只适用于签名的请求,但谢天谢地,您已经在这样做了。
如果您添加一个类似&request-content-type="application/force-download"的参数,就可以实现这个目的。
查看S3 GET对象文档的请求参数部分:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html

8ftvxx2r

8ftvxx2r3#

问题是如何通过编程方式进行设置,但要通过AWS控制台手动进行设置:

  • 在S3中选择一个文件。
  • 属性〉元数据〉添加更多元数据
  • 关键字:内容处置值:附件
  • 保存
0mkxixxg

0mkxixxg4#

如果您的S3网站在CloudFront之后,不要忘记在重试之前使文件无效!这将清除缓存的文件。
您可以移至下列网址,以取得无效验证页面:

Cloudfront -> Distribution Settings -> Invalidation

然后输入文件的路径。
使文件无效需要一些时间。对于我的文件,花了5分钟。

kupeojn6

kupeojn65#

您应该使用$s3->getObject()ResponseContentDisposition参数来设定回应的内容配置。您可以使用此参数来胁迫下载档案。

$s3->getObject([
  "Bucket" => "example",
  "Key" => "example.txt",
  "ResponseContentDisposition" => 'attachment; filename="example.txt"'
]);
jutyujz0

jutyujz06#

你不能告诉浏览器如何处理一个远程文件。通过重定向到amazon,你告诉浏览器在那里开始一个新的请求。你对那个请求没有任何控制权。
我能想到的唯一解决方案是将图像打包成zip文件或类似的文件。当然,这增加了另一种(可能很烦人)形式的复杂性。

相关问题