class ActiveStorage::Blob

Schema: id, key, filename, content_type, metadata, byte_size, checksum, created_at

Public Class Methods

build_after_upload(io:, filename:, content_type: nil, metadata: nil) click to toggle source
# File lib/active_storage/blob.rb, line 15
def build_after_upload(io:, filename:, content_type: nil, metadata: nil)
  new.tap do |blob|
    blob.filename     = filename
    blob.content_type = content_type
    blob.metadata     = metadata

    blob.upload io
  end
end
create_after_upload!(io:, filename:, content_type: nil, metadata: nil) click to toggle source
# File lib/active_storage/blob.rb, line 25
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!)
end

Public Instance Methods

delete() click to toggle source
# File lib/active_storage/blob.rb, line 56
def delete
  service.delete key
end
download() click to toggle source
# File lib/active_storage/blob.rb, line 51
def download
  service.download key
end
filename() click to toggle source
# File lib/active_storage/blob.rb, line 35
def filename
  ActiveStorage::Filename.new(self[:filename])
end
key() click to toggle source

We can't wait until the record is first saved to have a key for it

# File lib/active_storage/blob.rb, line 31
def key
  self[:key] ||= self.class.generate_unique_secure_token
end
purge() click to toggle source
# File lib/active_storage/blob.rb, line 60
def purge
  delete
  destroy
end
purge_later() click to toggle source
# File lib/active_storage/blob.rb, line 65
def purge_later
  ActiveStorage::PurgeJob.perform_later(self)
end
upload(io) click to toggle source
# File lib/active_storage/blob.rb, line 44
def upload(io)
  self.checksum  = compute_checksum_in_chunks(io)
  self.byte_size = io.size

  service.upload(key, io, checksum: checksum)
end
url(expires_in: 5.minutes, disposition: :inline) click to toggle source
# File lib/active_storage/blob.rb, line 39
def url(expires_in: 5.minutes, disposition: :inline)
  service.url key, expires_in: expires_in, disposition: disposition, filename: filename
end

Private Instance Methods

compute_checksum_in_chunks(io) click to toggle source
# File lib/active_storage/blob.rb, line 71
def compute_checksum_in_chunks(io)
  Digest::MD5.new.tap do |checksum|
    while chunk = io.read(5.megabytes)
      checksum << chunk
    end

    io.rewind
  end.base64digest
end