首页 文章

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

提问于
浏览
18

我一直在开发一个新的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开始下载文件 .

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

  • 使用 redirect() 将打开文件而不下载它;要么

  • 更改 Headers 为此代码:

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服务器下载,而不是从我的网站下载?

5 回答

  • 8

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

    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上传并设置正确的 Headers 后设置这些 .

  • 9

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

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

    如果你添加一个像 &request-content-type="application/force-download" 这样的参数就可以了 .

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

  • 0

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

    • 在S3中选择一个文件 .

    • 属性>元数据>添加更多元数据

    • Key:Content-Disposition Value:Attachment

    • 保存

  • 30

    如果您的S3网站位于CloudFront后面,请不要忘记在再次尝试之前使文件无效!这将清除缓存的文件 .

    您可以转到以下地址进入失效页面:

    Cloudfront -> Distribution Settings -> Invalidation
    

    然后输入文件的路径 .

    将文件无效需要一些时间 . 对于我的文件,花了5分钟 .

  • -3

    您无法告诉浏览器如何处理远程文件 . 通过重定向到亚马逊,您告诉浏览器在那里开始新的请求 . 您无法控制该请求 .

    我能想到的唯一解决方案是将图像打包成zip文件或类似文件 . 当然,这增加了另一种(可能令人讨厌的)复杂形式 .

相关问题