Как использовать Paperclip без файла, просто с помощью строки?
У меня есть файл rake, который читает содержимое через HTTP, и я хочу использовать программу "Скрепка" для хранения загруженного контента на Amazon S3. Он отлично работает, когда я предоставляю локальный файл, но я хотел бы установить содержимое в виде строки и установить тип содержимого вручную.
Не работает следующее. Ошибка не выдается, запись базы данных обновляется, но файл S3 не создается:
p.attachment = "Test"
p.attachment_file_name = "test.txt"
p.attachment_content_type = "text/plain"
p.attachment_file_size = "Test".size
p.attachment_updated_at = Time.now
p.save
Думаю, я мог бы написать временный файл с моим контентом, но это было бы довольно неэффективным решением.
Ответы
Ответ 1
Нет, вам нужно создать файл со своей строкой.
Просто посмотрите исходный код Paperclip:
https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/attachment.rb#L77
а также
https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/iostream.rb#L5
когда вы назначаете что-то, используя my_model.attachment =, Paperclip хочет файл файл.
Ответ 2
Чтобы избежать засорения файловой системы временными файлами, вы можете использовать StringIO
, как в:
p.attachment = StringIO.new(your_string)
Ответ 3
Немного поздно, но я отключил его, создав Tempfile, используя ruby 1.9.2 rails 3.1
file = Tempfile.new( ["file_name", '.txt'] )
file.write( "my test string".force_encoding('utf-8') )
p.attachment = file
Ответ 4
Как для скрепки, так и для carierwave я создаю такой класс. У этого есть оба метода, необходимые для издевательства загрузки файла, который они любят видеть.
class FakeFileIO < StringIO
attr_reader :original_filename
attr_reader :path
def initialize(filename, content)
super(content)
@original_filename = File.basename(filename)
@path = File.path(filename)
end
end
Работает как сон
Ответ 5
Подобно Aarons, но с соответствующим блочным методом, предложенным Ruby:
... всегда нужно вызвать unlink или закрыть в блоке обеспечения.
file = Tempfile.new('test.txt')
begin
file.write( "Test" )
p.attachment = file
p.save
# Whatever else you might need to do with the TempFile.
ensure
file.close
file.unlink # Deletes the temp file.
end