Запись вывода активной памяти в tempfile - PullRequest
0 голосов
/ 04 апреля 2020

Как записать вывод загрузки activestorage в временный файл.

Всякий раз, когда я читаю его потом, он просто становится пустой строкой.

Это код, который я пробовал:

@file_temp = Tempfile.new
@file_temp.binmode
@file_temp.write(model.activestorage_attribute.download)

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

ActiveStorage::Blob#download предоставит вам BLOB-объект, который можно использовать для различных операций из памяти.

Tempfile.new создаст файлы, которые являются объектами ввода-вывода и имеют указатель позиции. Когда вы записываете в файл, позиция продвигается.

Вам необходимо rewind к позиции. Попробуйте следующее:

@file_temp = Tempfile.new
@file_temp.binmode
@file_temp.write(model.activestorage_attribute.download)
@file_temp.rewind

Тогда вы сможете прочитать данные:

@file_temp.read
#=> "...\x8F\xFF\x00\x16G\xFE\xAE\x0F\xE5\x0E\xED..."
0 голосов
/ 04 апреля 2020

Вы также можете просто позвонить ActiveStorage::Blob#open вместо того, чтобы заново изобретать колесо.

Загрузка большого двоичного объекта в временный файл на диске. Возвращает временный файл.

blob.open do |temp_file|
  # do something with file...
end
# file is automatically closed and unlinked

Если вы действительно хотите сделать это самостоятельно, то правильный способ сделать это:

# Using `Tempfile.open with a block ensures that
# the file is closed and unlinked
Tempfile.open do |tempfile| 
  tempfile.binmode
  # steams the file as chunks instead of loading it 
  # all into memory
  model.activestorage_attribute.download do |chunk|
    tempfile.write(chunk)
  end
  tempfile.rewind
  # do something with tempfile
end
...