如何在没有文件的情况下使用Paperclip,只需要一个字符串?

时间:2010-11-03 15:55:05

标签: ruby-on-rails amazon-s3 paperclip

我有一个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 个答案:

答案 0 :(得分:43)

为避免使用临时文件乱丢文件系统,您可以使用StringIO,如下所示:

p.attachment = StringIO.new(your_string)

答案 1 :(得分:8)

有点晚了但我通过使用ruby 1.9.2 rails 3.1创建一个Tempfile来实现它。

file = Tempfile.new( ["file_name", '.txt'] )
file.write( "my test string".force_encoding('utf-8') )
p.attachment = file

答案 2 :(得分:3)

对于回形针和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

像梦一样工作

答案 3 :(得分:2)

不,你必须用你的字符串创建一个文件。

只需查看Paperclip源代码: https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/attachment.rb#L77https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/iostream.rb#L5

当您使用my_model.attachment =分配内容时,Paperclip需要一个文件对象。

答案 4 :(得分:1)

与Aarons类似,但使用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