Waka blog.

S3の署名付きURLを発行する際DL時のファイル名を動的に設定する(go言語)

やりたいこと

S3のファイルの署名付きURLを発行してDLさせる際、ファイル名を指定したい

実現方法

SetResponseContentDispositionを使用して attachmentfilename を設定する。

Content-Dispositionとは

Content-DispositionとはHTTPのレスポンスヘッダの一つ。主にブラウザが対象のリソースをどのように処理するかを指定するために使用する。

attachmentはダウンロードすべきファイルであることを明示し、 filenameはそのデフォルトのファイル名を指定することができる。

実装例

※aws-sdk-goのセットアップは完了しているものとする

func (repo *repository) GetPresignedURLWithFileName(bucketName string, filePath string, fileName string) (*url.URL, error) {
	svc := repo.s3

	input := &s3.GetObjectInput{
		Bucket: aws.String(bucketName),
		Key:    aws.String(filePath),
	}
        // content-dispositionを設定
	input.SetResponseContentDisposition(fmt.Sprintf("attachment; filename=\"%s\"", fileName))

	req, _ := svc.GetObjectRequest(input)

	// 署名付きURL生成
	urlStr, err := req.Presign(10 * time.Minute)
	if err != nil {
		repo.logger.Errorf("%v", err)
		return nil, err
	}

	parsedURL, err := url.Parse(urlStr)
	if err != nil {
		repo.logger.Errorf("%v", err)
		return nil, err
	}

	return parsedURL, nil
}