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

2022-08-30 16:54:37

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

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

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

我需要让文件在用户点击链接后尽快从真实的亚马逊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);
    

不幸的是,这两种方式都无济于事。第二种方法导致下载来自我的网站,而不是直接从亚马逊。

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


答案 1

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

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

在将文件上传到 S3 时,您需要设置它们。使用php SDK,你可以使用create_object

或者,您可以在上传后使用“change_content_type”或通过在 S3 中将文件复制到自身并设置正确的标头来设置这些设置。


答案 2

派对有点晚了,但通常对于文件,您不希望在存储时决定如何使用它。您希望能够存储文件一次,然后在一个区域中可能嵌入文件或显示在浏览器中,而在另一个区域中使用户能够下载相同的文件。

幸运的是,您可以通过在请求 URL 中提供覆盖参数来做到这一点。它仅适用于签名请求,但幸运的是您已经在这样做了。

如果您添加这样的参数,应该可以解决问题。&request-content-type="application/force-download"

查看 S3 GET 对象文档的“请求参数”部分:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html


推荐