Как использовать Paperclip без файла, просто со строкой? - PullRequest
14 голосов
/ 03 ноября 2010

У меня есть файл rake, который читает контент по HTTP, и я хочу использовать Paperclip для хранения загруженного контента на 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

Полагаю, я мог бы написать временный файл со своим контентом, но это было бы довольно неэффективным решением.

Ответы [ 5 ]

43 голосов
/ 19 марта 2013

Чтобы не засорять файловую систему временными файлами, вы можете использовать StringIO как в:

p.attachment = StringIO.new(your_string)
8 голосов
/ 11 ноября 2011

Уже немного поздно, но я выполнил его, создав 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
3 голосов
/ 08 июня 2015

Как для скрепки, так и для 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

Работает как сон

2 голосов
/ 03 ноября 2010

Нет, вам нужно создать файл с вашей строкой.

Просто посмотрите на исходный код 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 хочет получить объект файла.

1 голос
/ 14 мая 2015

Аналогично Ааронсу, но с правильным методом блока, как предложено Ruby :

... всегда следует вызывать unlink или close в блоке обеспечения.

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
...