如何访问使用Paperclip / Ruby on Rails上传的文件的原始内容?

时间:2011-07-02 06:30:48

标签: ruby-on-rails paperclip

我正在使用Paperclip / S3进行文件上传。我上传文本类文件(不是.txt,但它们本质上是.txt)。在show controller中,我希望能够获取上载文件的内容,但不要将内容视为其属性之一。我能在这做什么?

attachment_file_name: "test.md", attachment_content_type: "application/octet-stream", attachment_file_size: 58, attachment_updated_at: "2011-06-22 01:01:40"

PS - 似乎所有的Paperclip教程都是关于图像的,而不是文本文件。

7 个答案:

答案 0 :(得分:81)

在Paperclip 3.0.1中,你可以使用io_adapter,它不需要写入(和删除)本地文件系统。

Paperclip.io_adapters.for(attachment.file).read

答案 1 :(得分:5)

要访问该文件,您可以使用路径方法: csv_file.path http://rdoc.info/gems/paperclip/Paperclip/Attachment#path-instance_method

这可以与例如CSV阅读器一起使用。

答案 2 :(得分:4)

以下是我访问附件的原始内容的方法:

class Document

  has_attached_file :revision

  def revision_contents
    revision.copy_to_local_file.read
  end

end

请注意,我省略了我的回形针配置选项和任何类型的错误处理。

答案 3 :(得分:4)

@ jon-m答案需要更新以反映回形针的最新更改,以便将此工作需要更改为:

class Document

  has_attached_file :revision

  def revision_contents(path = 'tmp/tmp.any')
    revision.copy_to_local_file :original, path
    File.open(path).read
  end
end

@jwadsa​​ck使用Paperclip.io_adapters.for方法提到的有点令人费解,完成了同样的事情,似乎是一种更好,更清洁的方式来做这个恕我直言。

答案 4 :(得分:1)

在显示文件之前,您需要将文件的内容(使用Rubys File.open)加载到变量中。如果您的应用程序获得大量使用,这可能是一项昂贵的操作,因此在上传文件后阅读文件内容并将其放入数据库的文本列可能是值得的。

答案 5 :(得分:1)

附件已经从IOStream继承。 http://rdoc.info/github/thoughtbot/paperclip/master/Paperclip/Attachment

所以它应该是"#{attachment}"<% RDiscount.new(attachment).to_html %>send_data(attachment)。但是,您想要显示数据。

答案 6 :(得分:0)

这是我用来从回形针上传到活动存储的一种方法,应该会提供一些关于临时处理内存中的文件的指导。注意:这应该只用于相对较小的文件。

为 gem paperclip 6.1.0 编写

我有一个简单的模型

class Post
  has_attached_file :image
end

在 ruby​​ 中使用临时文件,因此我们不必担心关闭文件

  Tempfile.create do |tmp_file|
    post.image.copy_to_local_file(nil, tmp_file.path)

    post.image_temp.attach(
      io: tmp_file,
      filename: post.image_file_name,
      content_type: post.image_content_type
    )
  end