😊

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