背景
同一名のファイルをアップロードしたときにS3上でファイル名が衝突しないようにS3にはアップロード時のファイル名とは別名でアップロードしており、
S3のkeyとアップロード時のファイル名をテーブルで保持している。
Presigned URLを発行してそのままダウンロードするとS3にアップロードしたファイル名でダウンロードされる。
S3アップロード時のファイル名は衝突回避のため複雑なランダム文字列にしているためファイル名が分かりづらく、ファイルアップロード時の名前でダウンロードしたいモチベーションがあった。
対応内容
region = "{{your region}}"
bucket = "{{your bucket}}"
file_key = "{{your s3 file key}}"
file_name = "{{ダウンロード時に指定したいファイル名}}"
encoded_file_name = ERB::Util.url_encode(file_name) # 日本語のファイル名対応
aws_s3_client = Aws::S3::Client.new(region: region)
aws_s3_resource = Aws::S3::Resource.new(client: aws_s3_client)
aws_s3_bucket = aws_s3_resource.bucket(bucket)
aws_s3_object = aws_s3_bucket.object(file_key)
response_content_disposition = "attachment; filename=#{encoded_file_name}"
aws_s3_object.presigned_url(:get, response_content_disposition: response_content_disposition)
日本語対応のためにurl_encodeをする必要があった。
IEでの確認はとってないですが多分IE対応するならもっとエンコードのパターンを分けないとダメそうな感じはしました。