😊
S3の 署名付きURL(Pre Signed URL)を使ってダウンロードするファイル名を指定する方法 (C#)
通常のWEBアプリなどでダウンロードさせて保存する際のファイル名を指定するにはContentDispositionを指定すれば良いが、S3の署名付きURLだとどうするか?
要点
- GetPreSignedUrlRequest の ResponseHeaderOverrides に ContentDisposition でファイル名を指定すればOK
- ファイル名に日本語が含まれていると 「Header value cannot be represented using ISO-8859-1」的なエラーが発生するのでエンコードして設定する。
実装したコード
public string GetPreSignedUrl(IAmazonS3 client, string backet, string fileKey, string? downloadFileName)
{
var request = new GetPreSignedUrlRequest
{
BucketName = backet,
Key = fileKey,
Expires = DateTime.UtcNow.AddHours(1)
};
// downloadFileNameが指定されていたら ContentDispositionにfilenameを設定
if (!string.IsNullOrEmpty(downloadFileName))
{
var sb = new StringBuilder();
foreach (var b in System.Text.Encoding.UTF8.GetBytes(downloadFileName))
{
sb.Append((char)b);
}
var headerOverride = new ResponseHeaderOverrides();
headerOverride.ContentDisposition = $"attachment;filename=\"{sb.ToString()}\"";
request.ResponseHeaderOverrides = headerOverride;
}
return client.GetPreSignedURL(request);
}
Discussion