Spec-Zone.ru › Ruby on Rails 5.2

класс ActiveStorage::Blob

Родитель:
ActiveRecord::Base
Включенные модули:
ActiveStorage::Blob::Analyzable, ActiveStorage::Blob::Identifiable, ActiveStorage::Blob::Representable

Объект Blob — это запись, содержащая метаданные о файле и ключ для хранения этого файла на сервисе. Объекты Blob можно создавать двумя способами:

  1. После того, как файл был загружен на сервер в службу через create_after_upload!.

  2. До непосредственной загрузки файла на клиентской стороне в службу через create_before_direct_upload!.

Первый вариант не требует интеграции с JavaScript на стороне клиента и может быть использован любым другим сервисом на стороне сервера, работающим с файлами. Второй вариант быстрее, поскольку вы не используете собственный сервер в качестве промежуточной точки для загрузки, и он может работать с развертываниями, такими как Heroku, которые не предоставляют большого объёма дискового пространства.

Объекты Blob предназначены для неизменяемости, что касается ссылки на конкретный файл. Вы можете обновлять метаданные Blob на последующих этапах, но не следует обновлять ключ или изменять загруженный файл. Если вам нужно создать производный объект или каким-либо образом изменить Blob, просто создайте новый Blob и удалите старый.

Публичные методы класса

build_after_upload(io:, filename:, content_type: nil, metadata: nil) Показать исходный код
# 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 был загружен на сервер.

create_after_upload!(io:, filename:, content_type: nil, metadata: nil) Показать исходный код
# 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 сохраняется. Это делается для того, чтобы избежать загрузки (что может занять время), при этом сохраняя открытую транзакцию базы данных.

create_before_direct_upload!(filename:, byte_size:, checksum:, content_type: nil, metadata: nil) Показать исходный код
# 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 может быть связан с соответствующей записью с использованием подписанного идентификатора.

find_signed(id) Показать исходный код
# 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.

Методы публичного экземпляра

audio?() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 105
def audio?
  content_type.start_with?("audio")
end

Возвращает true, если тип содержимого этого объекта blob находится в диапазоне аудио, например, audio/mpeg.

delete() Показать исходный код
# 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.

download(&block) Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 164
def download(&block)
  service.download key, &block
end

Загружает файл, связанный с этим объектом blob. Если блок не задан, весь файл считывается в память и возвращается. Это потребует много оперативной памяти для очень больших файлов. Если блок задан, загрузка ведётся по частям.

filename() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 95
def filename
  ActiveStorage::Filename.new(self[:filename])
end

Возвращает экземпляр ActiveStorage::Filename имени файла, который можно использовать для запроса имени файла без расширения, расширения и очищенной версии имени файла, безопасной для использования в URL.

image?() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 100
def image?
  content_type.start_with?("image")
end

Возвращает true, если тип содержимого этого объекта blob находится в диапазоне изображений, например, image/png.

key() Показать исходный код
# 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 или проверенной формы ключа.

purge() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 180
def purge
  destroy
  delete
rescue ActiveRecord::InvalidForeignKey
end

Удаляет файл на службе и затем удаляет запись объекта blob. Это рекомендуемый способ удаления нежелательных объектов blob. Однако следует учесть, что удаление файла со службы инициирует HTTP-соединение со службой, что может быть медленным или запрещено, поэтому не следует использовать этот метод внутри транзакции или в обратных вызовах. Используйте #purge_later вместо этого.

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, когда вызов необходимо выполнить из транзакции, обратного вызова или любой другой ситуации реального времени.

service_headers_for_direct_upload() Показать исходный код
# 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.

service_url(expires_in: service.url_expires_in, disposition: :inline, filename: nil, **options) Показать исходный код
# 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 в представлении.

service_url_for_direct_upload(expires_in: service.url_expires_in) Показать исходный код
# 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, отвечающей за загрузку.

signed_id() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 80
def signed_id
  ActiveStorage.verifier.generate(id, purpose: :blob_id)
end

Возвращает подписанный идентификатор для этого объекта blob, подходящий для ссылки на клиентской стороне без риска подделки. Он использует общефреймворковый верификатор на ActiveStorage.verifier, но с выделенной целью.

text?() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 115
def text?
  content_type.start_with?("text")
end

Возвращает true, если тип содержимого этого объекта blob находится в диапазоне текста, например, text/plain.

upload(io) Показать исходный код
# 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!.

video?() Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API