2016-11-05 7 views
0

私はS3からダウンロードしているファイルの名前を変更しようとしていますが、代わりにファイル名としてバケットキーを取得しています。バケットキーと異なるファイル名のS3ファイルをダウンロード

私はS3バケットから物をダウンロードするための署名付きURLを取得するためにこの関数を使用しています。

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'が正しい解決策ではないことを認識したときにコメントを削除しました。あなたはヘッダーに関連したものを追加しています。これは 'query-string-parameter 'ではなく' response-content-disposition'です。 '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 - 同意し、更新しました。 –

関連する問題