2016-11-05 62 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同意並更新。 –

相關問題