强制从s3亚马逊服务器下载

Kha*_*led 21 php codeigniter download amazon-s3

我一直在开发一个新的Web应用程序,它依赖于Amazon S3服务器作为存储系统,Codeiginter作为PHP框架.

我需要在单击链接时强制下载文件.原始网址如下所示:

http://www.our-web.com/download/do/1.jpg

它生成一个临时签名的URL到Amazon S3服务器上的实际文件,如下所示:

http://main_bucket.s3.amazonaws.com/post/1/1.jpg?AWSAccessKeyId=AKIAJEOQKYPKC3CCU5RA&Expires=1305395426&Signature=iuzCdA22gImLK192%2BMAhk8OkAY8%3D

我需要在用户点击链接后立即从真正的Amazon URL开始下载文件.

我现在有两种方法可以这样做:

  1. 使用redirect()会打开文件而不下载它; 要么
  2. 改变标题为此代码:

    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);
    
    Run Code Online (Sandbox Code Playgroud)

不幸的是,这两种方式对我没有帮助.第二种方法导致下载来自我的网站,而不是直接来自亚马逊.

如何强制文件直接从Amazon S3服务器下载,而不是从我的网站下载?

Geo*_*ord 31

您只需要在S3中的文件上设置正确的标题,以强制浏览器下载而不是打开文件.设置这些:

Content-Disposition: attachment; filename=FILENAME.EXT
Content-Type: application/octet-stream
Run Code Online (Sandbox Code Playgroud)

将文件上传到S3时需要设置它们.随着PHP SDK你会使用create_object.

或者您可以在使用"change_content_type"上传后或在S3 中将文件复制到自身并设置正确的标题时设置这些.

  • 它已通过更改文件元来解决,如此代码所示: $opt['meta']['Content-Type'] = 'binary/octet-stream'; (2认同)
  • 我相信唯一实际需要的是内容配置标头。无需设置内容类型。 (2认同)

Tom*_*rie 15

派对迟到了,但经常有一个文件,你不想在存储时决定它将如何使用.您希望能够存储文件一次,然后在一个可能嵌入文件或显示在浏览器中的区域中,并在另一个区域中使用户能够下载相同的文件.

幸运的是,您可以通过在请求URL中提供覆盖参数来实现.它只适用于已签名的请求,但幸运的是,您已经这样做了.

如果你添加这样的参数&request-content-type="application/force-download"应该做的伎俩.

查看S3 GET Object文档的Request Parameters部分:http: //docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html

  • 我相信正确的请求参数是`request-content-disposition = attachment; filename = FILENAME.EXT"`.你的`request-content-type`正在运行,因为它是一个未知的内容类型,所以浏览器默认下载它. (5认同)
  • 截至 2019 年,它实际上是 `response-content-disposition=attachment;%20FILENAME.EXT` (2认同)
  • 卢克评论的文档位于 https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html#API_GetObject_Example_9 (2认同)

小智 9

问题是关于以编程方式设置此方法,但是要通过AWS控制台手动设置:

  • 在S3中选择一个文件.
  • 属性>元数据>添加更多元数据
  • 关键:内容处理价值:附件
  • 保存