2016-11-05 96 views
0

我试图更改从S3下载的文件的名称,但它始终将存储桶密钥作为文件名取而代之。下载具有与存储桶密钥不同的文件名的S3文件

我使用这个函数来获得一个签名的URL从我的S3存储桶下载东西。

func GetFileLink(url, filename string) (string, error) { 
    svc := s3.New(some params) 

    params := &s3.GetObjectInput{ 
     Bucket: aws.String(a bucket name), 
     Key: aws.String(key), 
    } 

    req, _ := svc.GetObjectRequest(params) 
    req.SignedHeaderVals = make(map[string][]string) 
    req.SignedHeaderVals.Add("Content-Disposition", "filename=the filename I want") 
    str, err := req.Presign(15 * time.Minute) 
    if err != nil { 
     global.Log("[AWS GET LINK]:", params, err) 
    } 

    return str, err 
} 

而且我使用这在我的HTML文件,下载的文件与另一名:

<a href="Link given by the function" download="the filename I want">Download the file.</a> 

但我不断收到命名为斗密钥的文件。如何更改正在下载的文件的名称?

回答

5

根据Amazon GET Object Docs,你需要的参数实际上是response-content-disposition

根据GetObjectInput文档,GetObjectInput有一个参数来设置ResponseContentDisposition值。

尝试:

params := &s3.GetObjectInput{ 
    Bucket: aws.String(a bucket name), 
    Key: aws.String(key), 
    ResponseContentDisposition: "attachment; filename=the filename I want", 
} 

req, _ := svc.GetObjectRequest(params) 
str, err := req.Presign(15 * time.Minute) 

(注:不是必需的SignedHeaderVals使用)。

感谢迈克尔对我的原始答案进行了更正。

+0

当我意识到'req.SignedHeaderVals.Add'不是正确的解决方案时,我删除了注释。您正在添加与标题相关的内容 - 而不是查询字符串参数 - 这就是“响应内容处置”的含义。 'ResponseContentDisposition'需要作为参数传递给['GetObjectInput'](https://github.com/aws/aws-sdk-go/blob/master/service/s3/api.go#L7495-L7570)。随意采取此信息并相应地修改您的答案。 –

+0

...假设你同意。 [GetObjectInput]的文档(http://docs.aws.amazon.com/sdk-for-go/api/service/s3/#GetObjectInput)表示这会“设置响应的标题”,这可能会引起误解。 *请求S3在这个请求的响应中重写头部*会更加精确,如果这种方式看起来像是这样。 –

+0

谢谢@ Michael-sqlbot同意并更新。 –

相关问题