diff options
author | Gannon McGibbon <gannon.mcgibbon@gmail.com> | 2019-07-31 12:55:00 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-31 12:55:00 -0400 |
commit | 4b65173479830f257ce2299c24eda2ffc6c9db5e (patch) | |
tree | 12baa31872fd592771f4e03098aa6a562146fd48 /activestorage/lib | |
parent | 33671d30f4a5a7c1b7d21379e72effdadf3b46b8 (diff) | |
parent | e6d2e8bf9b3d9af6af74a4beb8934ba7558f321b (diff) | |
download | rails-4b65173479830f257ce2299c24eda2ffc6c9db5e.tar.gz rails-4b65173479830f257ce2299c24eda2ffc6c9db5e.tar.bz2 rails-4b65173479830f257ce2299c24eda2ffc6c9db5e.zip |
Merge pull request #36791 from peterzhu2118/s3-upload-disposition
Upload with filename and disposition for S3
Diffstat (limited to 'activestorage/lib')
-rw-r--r-- | activestorage/lib/active_storage/service/s3_service.rb | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/activestorage/lib/active_storage/service/s3_service.rb b/activestorage/lib/active_storage/service/s3_service.rb index e4bd57048a..a73f6ab526 100644 --- a/activestorage/lib/active_storage/service/s3_service.rb +++ b/activestorage/lib/active_storage/service/s3_service.rb @@ -20,12 +20,14 @@ module ActiveStorage @upload_options = upload end - def upload(key, io, checksum: nil, content_type: nil, **) + def upload(key, io, checksum: nil, filename: nil, content_type: nil, disposition: nil, **) instrument :upload, key: key, checksum: checksum do + content_disposition = content_disposition_with(filename: filename, type: disposition) if disposition && filename + if io.size < multipart_upload_threshold - upload_with_single_part key, io, checksum: checksum, content_type: content_type + upload_with_single_part key, io, checksum: checksum, content_type: content_type, content_disposition: content_disposition else - upload_with_multipart key, io, content_type: content_type + upload_with_multipart key, io, content_type: content_type, content_disposition: content_disposition end end end @@ -103,16 +105,16 @@ module ActiveStorage MAXIMUM_UPLOAD_PARTS_COUNT = 10000 MINIMUM_UPLOAD_PART_SIZE = 5.megabytes - def upload_with_single_part(key, io, checksum: nil, content_type: nil) - object_for(key).put(body: io, content_md5: checksum, content_type: content_type, **upload_options) + def upload_with_single_part(key, io, checksum: nil, content_type: nil, content_disposition: nil) + object_for(key).put(body: io, content_md5: checksum, content_type: content_type, content_disposition: content_disposition, **upload_options) rescue Aws::S3::Errors::BadDigest raise ActiveStorage::IntegrityError end - def upload_with_multipart(key, io, content_type: nil) + def upload_with_multipart(key, io, content_type: nil, content_disposition: nil) part_size = [ io.size.fdiv(MAXIMUM_UPLOAD_PARTS_COUNT).ceil, MINIMUM_UPLOAD_PART_SIZE ].max - object_for(key).upload_stream(content_type: content_type, part_size: part_size, **upload_options) do |out| + object_for(key).upload_stream(content_type: content_type, content_disposition: content_disposition, part_size: part_size, **upload_options) do |out| IO.copy_stream(io, out) end end |