2010-04-09 244 views
52

我有以GUID作为密钥名称存储在S3上的文件。Amazon S3更改文件下载名称

我使用的是预标识的URL下载按S3 REST API

我在我自己的数据库存储原始文件名。当用户点击从我的web应用程序下载文件我想返回它们的原始文件名,但是目前他们所获得的全部是GUID。我怎样才能做到这一点?

我的web应用程序在salesforce中,所以我没有太多的控制来做response.redirects,所有下载文件到web服务器,然后根据管理员的限制对其进行重命名。

是否有一些HTML重定向,元刷新,JavaScript我可以使用?有什么方法可以更改S3的下载文件名(我能想到的唯一方法是将对象应对为新名称,下载它,然后删除它)。

我想避免创建每个用户一个桶,我们将在每个桶有很多用户,仍然不能保证每一个文件,将有一个独特的名字

任何其他解决办法?

+3

下GetObject函数文档

更多信息,另一种合法的SO问题已结束营业的题外话!问题和答案也比绝大多数常见问题/答案有更多的票... – DeepSpace101 2013-04-03 03:54:44

+0

是的,显然更重要的是,我们试图有组织的事情有点武断,面对事实,它不能保证在未来有意义甚至现在。当人们开始询问和回答有关软件行业的问题时,发生了什么?由于这个组织,谁能找到答案?谁会发现软件中的任何组织结构都是一致的,并在整个行业中有明确定义如果没有这个明确的定义,将持续大量的时间组织它是一个相当愚蠢的浪费时间... – 2013-09-21 20:46:16

+0

我找到了这个答案,我没有这个组织的问题。 – 2014-06-08 18:11:39

回答

59

我猜你的十字架张贴了这个问题Amazon S3 forum,但为他人着想,我想在这里发布了答案:

如果只有一个曾经“用户名”为每个S3对象,那么您可以在s3文件上设置Content-Disposition标题以设置下载文件名: Content-Disposition:attachment;文件名= foo.bar

为公平起见,我想提一提,这是不是我提供在亚马逊论坛正确的答案,所有的学分应该去科林·罗德;-)

+0

是的,谢谢你提醒我。另一个重要信息是添加Content-Disposition时它是区分大小写的,并且不需要x-amz前缀。 – Daveo 2010-04-12 09:10:47

+2

查看下面的答案,自2011年1月起,也可以根据每个GET请求进行分析。因此,可以根据需要提供尽可能多的“用户文件名”。 – fabi 2015-09-30 09:50:12

+2

我需要将引号添加到文件名以使其起作用,所以我的标题是:Content-Disposition:attachment; filename =“foo.bar” – nathancahill 2015-11-11 21:34:33

18

在2011年1月初S3增加了请求头覆盖。此功能允许您为各个请求“动态”更改Content-Disposition标头。

有关更多详细信息,请参阅S3 documentation on getting objects

5

虽然接受的答案是正确的,但我觉得它很抽象,很难利用。

这是一块node.js代码,可以解决上述问题。我建议将其作为AWS Lambda执行以生成预先签名的Url。

var AWS = require('aws-sdk'); 
var s3 = new AWS.S3({ 
    signatureVersion: 'v4' 
}); 
const s3Url = process.env.BUCKET; 

module.exports.main = (event, context, callback) => { 
var s3key = event.s3key 
var originalFilename = event.originalFilename 

var url = s3.getSignedUrl('getObject', { 
     Bucket: s3Url, 
     Key: s3key, 
     Expires: 600, 
     ResponseContentDisposition: 'attachment; filename ="' + originalFilename + '"' 
    }); 

[... rest of Lambda stuff...] 

} 

请随便传入s3.getSignedUrl功能params对象的ResponseContentDisposition属性的注释。在http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property