класс ActiveStorage::Blob
Объект Blob — это запись, содержащая метаданные о файле и ключ для хранения этого файла на сервисе. Объекты Blob можно создавать двумя способами:
-
После того, как файл был загружен на сервер в службу через
create_after_upload!. -
До непосредственной загрузки файла на клиентской стороне в службу через
create_before_direct_upload!.
Первый вариант не требует интеграции с JavaScript на стороне клиента и может быть использован любым другим сервисом на стороне сервера, работающим с файлами. Второй вариант быстрее, поскольку вы не используете собственный сервер в качестве промежуточной точки для загрузки, и он может работать с развертываниями, такими как Heroku, которые не предоставляют большого объёма дискового пространства.
Объекты Blob предназначены для неизменяемости, что касается ссылки на конкретный файл. Вы можете обновлять метаданные Blob на последующих этапах, но не следует обновлять ключ или изменять загруженный файл. Если вам нужно создать производный объект или каким-либо образом изменить Blob, просто создайте новый Blob и удалите старый.
Публичные методы класса
# File activestorage/app/models/active_storage/blob.rb, line 51
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 Возвращает новый, несохранённый экземпляр Blob после того, как io был загружен на сервер.
# File activestorage/app/models/active_storage/blob.rb, line 64 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
Возвращает сохранённый экземпляр Blob после того, как io был загружен на сервер. Обратите внимание, что сначала создаётся объект Blob, затем io загружается, и только после этого Blob сохраняется. Это делается для того, чтобы избежать загрузки (что может занять время), при этом сохраняя открытую транзакцию базы данных.
# File activestorage/app/models/active_storage/blob.rb, line 73 def create_before_direct_upload!(filename:, byte_size:, checksum:, content_type: nil, metadata: nil) create! filename: filename, byte_size: byte_size, checksum: checksum, content_type: content_type, metadata: metadata end
Возвращает сохранённый объект Blob без загрузки файла на сервер. Этот Blob будет ссылаться на ключ, где ещё нет файла. Он предназначен для использования совместно с загрузкой на стороне клиента, которая сначала создаст объект Blob для создания подписанной URL-адреса для загрузки. Эта подписанная URL-адрес ссылается на ключ, сгенерированный Blob. После отправки формы с использованием прямой загрузки объект Blob может быть связан с соответствующей записью с использованием подписанного идентификатора.
# File activestorage/app/models/active_storage/blob.rb, line 46 def find_signed(id) find ActiveStorage.verifier.verify(id, purpose: :blob_id) end
Вы можете использовать подписанный идентификатор Blob для ссылки на него на стороне клиента, не опасаясь подделки. Это особенно полезно для прямых загрузок, когда клиентской стороне необходимо сослаться на Blob, который был создан до самой загрузки при отправке формы.
Подписанный идентификатор также используется для создания стабильных URL-адресов для Blob через контроллер Blobs.
Методы публичного экземпляра
# File activestorage/app/models/active_storage/blob.rb, line 105
def audio?
content_type.start_with?("audio")
end Возвращает true, если тип содержимого этого объекта blob находится в диапазоне аудио, например, audio/mpeg.
# File activestorage/app/models/active_storage/blob.rb, line 172
def delete
service.delete(key)
service.delete_prefixed("variants/#{key}/") if image?
end Удаляет файл на службе, связанный с этим объектом blob. Это следует делать только в том случае, если объект blob также будет удален, или иначе у вас будет неактуальная ссылка. В большинстве случаев рекомендуется использовать методы #purge и #purge_later.
# File activestorage/app/models/active_storage/blob.rb, line 164 def download(&block) service.download key, &block end
Загружает файл, связанный с этим объектом blob. Если блок не задан, весь файл считывается в память и возвращается. Это потребует много оперативной памяти для очень больших файлов. Если блок задан, загрузка ведётся по частям.
# File activestorage/app/models/active_storage/blob.rb, line 95 def filename ActiveStorage::Filename.new(self[:filename]) end
Возвращает экземпляр ActiveStorage::Filename имени файла, который можно использовать для запроса имени файла без расширения, расширения и очищенной версии имени файла, безопасной для использования в URL.
# File activestorage/app/models/active_storage/blob.rb, line 100
def image?
content_type.start_with?("image")
end Возвращает true, если тип содержимого этого объекта blob находится в диапазоне изображений, например, image/png.
# File activestorage/app/models/active_storage/blob.rb, line 87 def key # We can't wait until the record is first saved to have a key for it self[:key] ||= self.class.generate_unique_secure_token end
Возвращает ключ, указывающий на файл на службе, связанный с этим объектом blob. Ключ имеет стандартный формат защищённого токена из Rails. Например: XTAPjJCJiuDrLk3TmwyJGpUo. Этот ключ не предназначен для прямого отображения пользователю. Всегда ссылайтесь на объекты blob с помощью #signed_id или проверенной формы ключа.
# File activestorage/app/models/active_storage/blob.rb, line 180 def purge destroy delete rescue ActiveRecord::InvalidForeignKey end
Удаляет файл на службе и затем удаляет запись объекта blob. Это рекомендуемый способ удаления нежелательных объектов blob. Однако следует учесть, что удаление файла со службы инициирует HTTP-соединение со службой, что может быть медленным или запрещено, поэтому не следует использовать этот метод внутри транзакции или в обратных вызовах. Используйте #purge_later вместо этого.
# File activestorage/app/models/active_storage/blob.rb, line 188 def purge_later ActiveStorage::PurgeJob.perform_later(self) end
В очереди запрос задачи ActiveStorage::PurgeJob, который вызовет purge. Это рекомендуемый способ удаления объектов blob, когда вызов необходимо выполнить из транзакции, обратного вызова или любой другой ситуации реального времени.
# File activestorage/app/models/active_storage/blob.rb, line 138 def service_headers_for_direct_upload service.headers_for_direct_upload key, filename: filename, content_type: content_type, content_length: byte_size, checksum: checksum end
Возвращает Hash заголовков для запросов service_url_for_direct_upload.
# File activestorage/app/models/active_storage/blob.rb, line 124
def service_url(expires_in: service.url_expires_in, disposition: :inline, filename: nil, **options)
filename = ActiveStorage::Filename.wrap(filename || self.filename)
service.url key, expires_in: expires_in, filename: filename, content_type: content_type_for_service_url,
disposition: forced_disposition_for_service_url || disposition, **options
end Возвращает URL объекта blob на службе. Этот URL предназначен для краткосрочного использования в целях безопасности и не должен использоваться напрямую с пользователями. Вместо этого, service_url должен быть показан только как переадресация со стабильного, возможно, аутентифицированного URL. Скрытие service_url за переадресацией также даёт возможность изменить службы без обновления всех URL. И это позволяет кэшировать постоянные URL, которые перенаправляют на service_url в представлении.
# File activestorage/app/models/active_storage/blob.rb, line 133 def service_url_for_direct_upload(expires_in: service.url_expires_in) service.url_for_direct_upload key, expires_in: expires_in, content_type: content_type, content_length: byte_size, checksum: checksum end
Возвращает URL, который можно использовать для прямой загрузки файла для этого объекта blob на службу. Этот URL предназначен для краткосрочного использования в целях безопасности и генерируется только по требованию клиентской стороной JavaScript, отвечающей за загрузку.
# File activestorage/app/models/active_storage/blob.rb, line 80 def signed_id ActiveStorage.verifier.generate(id, purpose: :blob_id) end
Возвращает подписанный идентификатор для этого объекта blob, подходящий для ссылки на клиентской стороне без риска подделки. Он использует общефреймворковый верификатор на ActiveStorage.verifier, но с выделенной целью.
# File activestorage/app/models/active_storage/blob.rb, line 115
def text?
content_type.start_with?("text")
end Возвращает true, если тип содержимого этого объекта blob находится в диапазоне текста, например, text/plain.
# File activestorage/app/models/active_storage/blob.rb, line 153 def upload(io) self.checksum = compute_checksum_in_chunks(io) self.content_type = extract_content_type(io) self.byte_size = io.size self.identified = true service.upload key, io, checksum: checksum, **service_metadata end
Загружает io на службу на key для этого объекта blob. Объекты blob предназначены для неизменности, поэтому вы не должны использовать этот метод после того, как файл был загружен в соответствие с объектом blob. Если вам нужно создать производный объект blob, создайте новый объект blob на основе старого.
Перед загрузкой вычисляется контрольная сумма, которая отправляется на службу для проверки целостности передачи. Если контрольная сумма не совпадает с полученной на службе, будет выброшено исключение. Мы также измеряем размер io и сохраняем его в byte_size в записи объекта blob.
Обычно вам не нужно вызывать этот метод напрямую. Используйте методы фабрики классов build_after_upload и create_after_upload!.
# File activestorage/app/models/active_storage/blob.rb, line 110
def video?
content_type.start_with?("video")
end Возвращает true, если тип содержимого этого объекта blob находится в диапазоне видео, например, video/mp4.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.