aboutsummaryrefslogtreecommitdiffstats
path: root/activestorage/app
diff options
context:
space:
mode:
authorRyan Davidson <daviryan@aol.com>2018-05-06 16:25:05 +0100
committerRyan Davidson <daviryan@aol.com>2018-05-08 23:01:57 +0100
commit8e98bb7758f081622ab5c4eebf3730cce22ee627 (patch)
tree005431e48933ba96e655a56fabd436bcba442c1a /activestorage/app
parent5c7656d9a568fda855e6e558b7e44b1ba51425be (diff)
downloadrails-8e98bb7758f081622ab5c4eebf3730cce22ee627.tar.gz
rails-8e98bb7758f081622ab5c4eebf3730cce22ee627.tar.bz2
rails-8e98bb7758f081622ab5c4eebf3730cce22ee627.zip
Add option to ActiveStorage::Blob to set extract_content_type_from_io
This adds a boolean argument called identify to ActiveStorage::Blob methods #create_after_upload, #build_after_upload and #upload. It allows a user to bypass the automatic content_type inference from the io.
Diffstat (limited to 'activestorage/app')
-rw-r--r--activestorage/app/models/active_storage/blob.rb17
1 files changed, 10 insertions, 7 deletions
diff --git a/activestorage/app/models/active_storage/blob.rb b/activestorage/app/models/active_storage/blob.rb
index 0cd4ad8128..b8b3b62f22 100644
--- a/activestorage/app/models/active_storage/blob.rb
+++ b/activestorage/app/models/active_storage/blob.rb
@@ -44,21 +44,23 @@ class ActiveStorage::Blob < ActiveRecord::Base
end
# Returns a new, unsaved blob instance after the +io+ has been uploaded to the service.
- def build_after_upload(io:, filename:, content_type: nil, metadata: nil)
+ # When providing a content type, pass <tt>identify: false</tt> to bypass automatic content type inference.
+ def build_after_upload(io:, filename:, content_type: nil, metadata: nil, identify: true)
new.tap do |blob|
blob.filename = filename
blob.content_type = content_type
blob.metadata = metadata
- blob.upload io
+ blob.upload(io, identify: identify)
end
end
# Returns a saved blob instance after the +io+ has been uploaded to the service. Note, the blob is first built,
# then the +io+ is uploaded, then the blob is saved. This is done this way to avoid uploading (which may take
# time), while having an open database transaction.
- def create_after_upload!(io:, filename:, content_type: nil, metadata: nil)
- build_after_upload(io: io, filename: filename, content_type: content_type, metadata: metadata).tap(&:save!)
+ # When providing a content type, pass <tt>identify: false</tt> to bypass automatic content type inference.
+ def create_after_upload!(io:, filename:, content_type: nil, metadata: nil, identify: true)
+ build_after_upload(io: io, filename: filename, content_type: content_type, metadata: metadata, identify: identify).tap(&:save!)
end
# Returns a saved blob _without_ uploading a file to the service. This blob will point to a key where there is
@@ -142,13 +144,14 @@ class ActiveStorage::Blob < ActiveRecord::Base
#
# Prior to uploading, we compute the checksum, which is sent to the service for transit integrity validation. If the
# checksum does not match what the service receives, an exception will be raised. We also measure the size of the +io+
- # and store that in +byte_size+ on the blob record.
+ # and store that in +byte_size+ on the blob record. The content type is automatically extracted from the +io+ unless
+ # you specify a +content_type+ and pass +identify+ as false.
#
# Normally, you do not have to call this method directly at all. Use the factory class methods of +build_after_upload+
# and +create_after_upload!+.
- def upload(io)
+ def upload(io, identify: true)
self.checksum = compute_checksum_in_chunks(io)
- self.content_type = extract_content_type(io)
+ self.content_type = extract_content_type(io) if content_type.nil? || identify
self.byte_size = io.size
self.identified = true