我有一个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
我想我可以用我的内容写一个临时文件,但那将是一个非常低效的解决方案。
答案 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#L77 和 https://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