【问题标题】:How do you access the raw content of a file uploaded with Paperclip / Ruby on Rails?您如何访问使用 Paperclip / Ruby on Rails 上传的文件的原始内容?
【发布时间】:2011-07-02 06:30:48
【问题描述】:

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

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 - 似乎所有回形针教程都是关于图像,而不是文本文件。

【问题讨论】:

标签: ruby-on-rails paperclip


【解决方案1】:

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

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

【讨论】:

  • 我看到实际上这种方法会使用下一条日志消息写入本地文件系统:[paperclip] copying uploads/model/documents/1/Image1.jpg to local file /tmp/2fa67f482133f1c934235b73c2a0395420161123-27627-1xc7ieo.jpg
  • @Tensho 看起来你适合大多数适配器。如果您想避免写入磁盘,可以使用 StringIOAdapter: github.com/thoughtbot/paperclip/blob/master/lib/paperclip/…
  • @jwadsa​​ck,我需要做什么才能在默认的FileAdapter 上使用StringIOAdapter
  • @atreat 我错了。适配器确定如何加载数据。甚至StringIOAdaptercopies to a temporary file。我最初的回复意味着您没有在 Paperclip 的基础上添加自己的本地文件写入。
  • 感谢您的回复,这也是我在调查中发现的。我选择走这条路是因为我可以立即读取到内存中的单个文件写入比管理我自己的文件指针更好。
【解决方案2】:

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

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

【讨论】:

  • 从 csv_file.path 的返回不再是文件系统上的有效引用,至少对于本地存储而言。它现在返回根之后的路径......它返回 /class_name/attachment_name/blah/blah 而不是 /rails_root/public/system/class_name/attachment_name/blah/blah
  • 嗯,csv_file.path 非常适合我在 Paperclip 4.3.2 中的本地文件系统存储。
【解决方案3】:

@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】:

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

    class Document
    
      has_attached_file :revision
    
      def revision_contents
        revision.copy_to_local_file.read
      end
    
    end
    

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

    【讨论】:

    • 3.0.1 中的新功能:* API 更改:#to_file 已被删除。请改用#copy_to_local_file 方法。
    • 上面提到的这个 copy_to_local_file 不能这样工作,因为它需要 2 个参数用于样式和本地目标路径。 rdoc.info/gems/paperclip/Paperclip/Storage/…
    • @jwadsa​​ck 考虑到 API 的变化似乎好多了
    • 您可以这样做,例如:copy_to_local_file(nil, 'path_name') style 用于缩略图,可以留空以下载文字文件,尽管这有点无证..
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

        写给 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
        

        【讨论】:

          猜你喜欢
          • 2015-12-15
          • 1970-01-01
          • 2019-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-07
          • 2014-07-17
          相关资源
          最近更新 更多