【问题标题】:How can I use rubyzip to attach files in a zip archive to an ActiveStorage object Rails 5如何使用 ruby​​zip 将 zip 存档中的文件附加到 ActiveStorage 对象 Rails 5
【发布时间】:2018-10-02 10:10:34
【问题描述】:

我有一个带有一个使用 ActiveStorage 的附件的模型:

class ProofreadDocument < ApplicationRecord

  has_one_attached :file

end

我正在执行一项将文件附加到校对文档的 rake 任务。 这些文件被压缩成一个 zip 存档。

我知道我可以通过阅读 ActiveStorage 文档来附加以下文件:

@proofread_document.file.attach(io: File.open('/path/to/file'), filename: 'file.pdf')

我的 rake 任务中有以下内容:

    Zip::File.open(args.path_to_directory) do |zipfile|
          zipfile.each do |file|
            proofread_document = ProofreadDocument.new()
            proofread_document.file.attach(io: file.get_input_stream.read, filename: file.name)
            proofread_document.save
          end
     end

这会产生以下错误:

NoMethodError: undefined method `read' for #<String:0x007f8d894d95e0>

我需要一次读取每个文件的内容,以将它们附加到 proofread_document 实例。我该怎么做?

【问题讨论】:

  • 您需要对压缩文件进行任何处理吗?如果不是,为什么您不能在第一步中直接附加它,而不用担心任何 rake 任务?
  • 我不想附加 zip 文件。我想将 zip 中的每个文件附加到 ProofreadDocument 的不同实例。
  • 您是否尝试从file.get_input_stream.read 中删除read
  • 是的,我得到一个不同的错误。

标签: ruby ruby-on-rails-5 rubyzip


【解决方案1】:

通过将输入流包装在 StringIO 对象中,我能够成功,如下所示:

self.file.attach(io: StringIO.new(zip_entry.get_input_stream.read), filename: zip_entry.name, content_type: MS_WORD_CONTENT_TYPE)

【讨论】:

  • 您能否更新以在此处包含您的完整代码示例?看起来您在本节中使用的变量名称与您的问题使用的变量名称不同
  • 很遗憾attach 在直接为io 尝试调用#size 时尝试在zip_entry.get_input_stream 上调用#size。如果 size 可以单独传递给attach,那么它将直接与io: zip_entry.get_input_stream 一起工作。不过感谢这个黑客! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多