Spec-Zone.ru › Ruby on Rails 7.1

класс ActiveStorage::Blob

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

Объект Active Storage Blob

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

  1. До загрузки файла на сервер в хранилище, с помощью create_and_upload!. Для этой операции должен быть доступен перематываемый io с содержимым файла на сервере.

  2. До прямой загрузки файла клиентом в хранилище, с помощью create_before_direct_upload!.

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

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

Константы

MINIMUM_TOKEN_LENGTH

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

compose(blobs, filename:, content_type: nil, metadata: nil) Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 148
def compose(blobs, filename:, content_type: nil, metadata: nil)
  raise ActiveRecord::RecordNotSaved, "All blobs must be persisted." if blobs.any?(&:new_record?)

  content_type ||= blobs.pluck(:content_type).compact.first

  new(filename: filename, content_type: content_type, metadata: metadata, byte_size: blobs.sum(&:byte_size)).tap do |combined_blob|
    combined_blob.compose(blobs.pluck(:key))
    combined_blob.save!
  end
end

Объединить несколько объектов Blob в один «составной» объект Blob.

create_and_upload!(key: nil, io:, filename:, content_type: nil, metadata: nil, service_name: nil, identify: true, record: nil) Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 102
def create_and_upload!(key: nil, io:, filename:, content_type: nil, metadata: nil, service_name: nil, identify: true, record: nil)
  create_after_unfurling!(key: key, io: io, filename: filename, content_type: content_type, metadata: metadata, service_name: service_name, identify: identify).tap do |blob|
    blob.upload_without_unfurling(io)
  end
end

Создаёт новый экземпляр объекта Blob и затем загружает содержимое указанного io в хранилище. Экземпляр объекта Blob будет сохранён до начала загрузки, чтобы предотвратить затирание одной загрузки другой из-за коллизий ключей. При указании типа контента, передайте identify: false чтобы обойти автоматическое определение типа контента.

create_before_direct_upload!(key: nil, filename:, byte_size:, checksum:, content_type: nil, metadata: nil, service_name: nil, record: nil) Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 113
def create_before_direct_upload!(key: nil, filename:, byte_size:, checksum:, content_type: nil, metadata: nil, service_name: nil, record: nil)
  create! key: key, filename: filename, byte_size: byte_size, checksum: checksum, content_type: content_type, metadata: metadata, service_name: service_name
end

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

find_signed(id, record: nil, purpose: :blob_id) Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 75
def find_signed(id, record: nil, purpose: :blob_id)
  super(id, purpose: purpose)
end

Вы можете использовать подписанный идентификатор объекта Blob для ссылки на него на стороне клиента, не опасаясь подмены. Это особенно полезно для прямых загрузок, когда клиентской стороне нужно сослаться на объект Blob, который был создан до самой загрузки при отправке формы.

Подписанный идентификатор также используется для создания стабильных ссылок на объект Blob через контроллер Blobs.

Вызов метода суперкласса
find_signed!(id, record: nil, purpose: :blob_id) Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 83
def find_signed!(id, record: nil, purpose: :blob_id)
  super(id, purpose: purpose)
end

Действует аналогично find_signed, но при этом вызовет исключение ActiveSupport::MessageVerifier::InvalidSignature если подписанный идентификатор либо просрочен, либо имеет несоответствие цели, предназначен для другой записи или был изменён. Также будет вызвано исключение ActiveRecord::RecordNotFound если по валидному подписанному идентификатору не удастся найти запись.

Вызов метода суперкласса
generate_unique_secure_token(length: MINIMUM_TOKEN_LENGTH) Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 122
def generate_unique_secure_token(length: MINIMUM_TOKEN_LENGTH)
  SecureRandom.base36(length)
end

Для предотвращения проблем с регистронезависимыми файловыми системами, особенно в сочетании с базами данных, которые обрабатывают индексы как регистрозависимые, все ключи объектов Blob будут содержать только символы алфавита base-36 в нижнем регистре. Для поддержания того же или более высокого уровня энтропии, что и в кодировании base-58, используемом в has_secure_token, количество используемых байтов увеличено до 28 с 24 по умолчанию.

unattached() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 44
scope :unattached, -> { where.missing(:attachments) }

Возвращает объекты Blob, которые не привязаны ни к одной записи.

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

attachments() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 38
has_many :attachments

Возвращает связанные экземпляры ActiveStorage::Attachment.

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

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

custom_metadata() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 181
def custom_metadata
  self[:metadata][:custom] || {}
end
custom_metadata=(metadata) Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 185
def custom_metadata=(metadata)
  self[:metadata] = self[:metadata].merge(custom: metadata)
end
delete() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 315
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 275
def download(&block)
  service.download key, &block
end

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

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

Загружает часть файла, связанного с этим объектом blob.

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

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

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

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

key() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 169
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(length: MINIMUM_TOKEN_LENGTH)
end

Возвращает ключ, указывающий на файл на сервисе, связанный с этим объектом blob. Ключ имеет формат безопасного токена из Rails в нижнем регистре. Например: xtapjjcjiudrlk3tmwyjgpuobabd. Данный ключ не предназначен для прямого отображения пользователю. Всегда ссылайтесь на объекты blob, используя signed_id или проверенную форму ключа.

open(tmpdir: nil, &block) Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 297
def open(tmpdir: nil, &block)
  service.open(
    key,
    checksum: checksum,
    verify: !composed,
    name: [ "ActiveStorage-#{id}-", filename.extension_with_delimiter ],
    tmpdir: tmpdir,
    &block
  )
end

Загружает blob в временный файл на диске. Возвращает временный файл.

Имя временного файла начинается с ActiveStorage- и идентификатора объекта blob. Его расширение соответствует расширению объекта blob.

По умолчанию временный файл создается в Dir.tmpdir. Чтобы создать его в другом каталоге, передайте tmpdir:.

blob.open(tmpdir: "/path/to/tmp") do |file|
  # ...
end

Временный файл автоматически закрывается и удаляется после выполнения данного блока.

Вызывает исключение ActiveStorage::IntegrityError, если загруженные данные не соответствуют контрольной сумме объекта blob.

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

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

purge_later() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 331
def purge_later
  ActiveStorage::PurgeJob.perform_later(self)
end

Добавляет в очередь ActiveStorage::PurgeJob для вызова purge. Это рекомендуемый способ удаления объектов blob из транзакции, обратного вызова Active Record или в любой другой ситуации реального времени.

service() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 336
def service
  services.fetch(service_name)
end

Возвращает экземпляр сервиса, который может быть настроен глобально или по каждому вложению.

service_headers_for_direct_upload() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 225
def service_headers_for_direct_upload
  service.headers_for_direct_upload key, filename: filename, content_type: content_type, content_length: byte_size, checksum: checksum, custom_metadata: custom_metadata
end

Возвращает Hash заголовков для запросов service_url_for_direct_upload.

service_url_for_direct_upload(expires_in: ActiveStorage.service_urls_expire_in) Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 220
def service_url_for_direct_upload(expires_in: ActiveStorage.service_urls_expire_in)
  service.url_for_direct_upload key, expires_in: expires_in, content_type: content_type, content_length: byte_size, checksum: checksum, custom_metadata: custom_metadata
end

Возвращает URL-адрес, который может быть использован для прямой загрузки файла для данного объекта blob на сервис. Этот URL-адрес предназначен для кратковременного использования в целях безопасности и генерируется только по запросу со стороны клиентской JavaScript-стороны, ответственной за выполнение загрузки.

signed_id(purpose: :blob_id, expires_in: nil, expires_at: nil) Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 161
def signed_id(purpose: :blob_id, expires_in: nil, expires_at: nil)
  super
end

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

Вызывает метод суперкласса
text?() Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 205
def text?
  content_type.start_with?("text")
end

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

upload(io, identify: true) Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 252
def upload(io, identify: true)
  unfurl io, identify: identify
  upload_without_unfurling io
end

Загружает io в службу на key для этого блока. Блоки предназначены для неизменяемости, поэтому вы не должны использовать этот метод после того, как файл уже был загружен в блок. Если вы хотите создать производный блок, создайте новый блок на основе старого.

Перед загрузкой мы вычисляем контрольную сумму, которая отправляется в службу для проверки целостности транзита. Если контрольная сумма не соответствует полученной службой, будет вызвано исключение. Мы также измеряем размер io и сохраняем его в byte_size в записи блока. Тип контента автоматически извлекается из io , если вы не укажете content_type и не передадите identify как false.

Обычно вам не нужно вызывать этот метод напрямую. Используйте метод класса create_and_upload! вместо этого. Если вы все же используете этот метод напрямую, убедитесь, что используете его с постоянным Blob, иначе данные другого блока могут быть перезаписаны в службе.

url(expires_in: ActiveStorage.service_urls_expire_in, disposition: :inline, filename: nil, **options) Показать исходный код
# File activestorage/app/models/active_storage/blob.rb, line 213
def url(expires_in: ActiveStorage.service_urls_expire_in, disposition: :inline, filename: nil, **options)
  service.url key, expires_in: expires_in, filename: ActiveStorage::Filename.wrap(filename || self.filename),
    content_type: content_type_for_serving, disposition: forced_disposition_for_serving || disposition, **options
end

Возвращает URL блока в службе. Это возвращает постоянный URL для общедоступных файлов и возвращает краткосрочный URL для частных файлов. Частные файлы подписаны и не предназначены для публичного использования. Вместо этого URL должен быть показан только как переадресация со стабильного, возможно, аутентифицированного URL. Скрытие URL за переадресацией также позволяет вам изменять службы без обновления всех URL.

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

Возвращает true, если тип контента этого блока находится в диапазоне видео, например, video/mp4.

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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