【问题标题】:How to upload multiple files with Carrierwave using a single json/array column如何使用单个 json/array 列通过 Carrierwave 上传多个文件
【发布时间】:2015-05-12 20:04:11
【问题描述】:

我在 Rails 3 项目中有一个 Activerecord 模型,我正在尝试向其上传多个文件附件,我使用 MySQL 作为数据库。

在当前版本的 Carrierwave it talks about 中,现在能够将多个上传的文件存储在一个数组或 Json 类型的 ActiveRecord 字段中 - 所以我试图让这种方法发挥作用,但我不清楚如何实现这一点。

在所有教程/railscasts/SO 问题中,我只发现人们使用更传统的has_many 关系来链接到单独的附件记录。

在我的情况下,我有一个发票记录,其中每张发票都需要有多个“作业文件”附件,我正在遵循 Carrierwave README 中的示例。

我在模型中添加了一个 json 字段:

class AddJobfileToInvoice < ActiveRecord::Migration
  def change
    add_column :invoices, :jobfile, :json
  end
end

在表单视图中我启用了多次上传

<%= form_for(@invoice, html: {class: 'invoice-form', multipart: true}) do |f| %>
.....    
<%= f.file_field :jobfile, multiple: true%>

在我发布的参数中,我可以看到正确的多个上传数组以params[:invoice][:jobfile] 的形式出现:

params[:invoice][:jobfile]
=> [#<ActionDispatch::Http::UploadedFile:0x000000065996f0     @original_filename="test1.gif", @content_type="image/gif", @headers="Content-Disposition: form-data; name=\"invoice[jobfile][]\"; filename=\"test1.gif\"\r\nContent-Type: image/gif\r\n", @tempfile=#<File:/tmp/RackMultipart20150311-33374-1cqjv3i>>, 
#<ActionDispatch::Http::UploadedFile:0x0000000659a0c8 @original_filename="test2.gif", @content_type="image/gif", @headers="Content-Disposition: form-data; name=\"invoice[jobfile][]\"; filename=\"test2.gif\"\r\nContent-Type: image/gif\r\n", @tempfile=#<File:/tmp/RackMultipart20150311-33374-15stv05>>]

然后我根据 Carrierwave 自述文件缓存了文件并保存了模型

@invoice = Invoice.new(params[:invoice])
@invoice.jobfile = params[:invoice][:jobfile]
@invoice.save

但是,一旦我保存发票模型,我就会收到 Jobfile You are not allowed to upload nil files 错误

谁能发帖或指出一个让 Carrierwave 使用单个 JSON(或数组)字段上传多个文件的工作示例?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 file-upload carrierwave jquery-file-upload


    【解决方案1】:

    所以我认为问题在于 MySQL 不支持 Json 或 Array 字段类型,因此看起来当前的 Carrierwave 实现仅适用于 PostgreSQL。

    不知何故,我的迁移在没有引发错误的情况下继续进行,而是默默地创建了一个字符串字段 - 允许单个文件上传工作,但不能上传多个文件。

    当我尝试在一个新的 VM 中从头开始复制整个过程时,它确实引发了一个有意义的错误,使问题变得非常明显。

    【讨论】:

      【解决方案2】:

      问题是因为 SQLite3 或 MySQL 在 PostgreSQL 中没有列类型 json。因此,您可以尝试将类型从 json 更改为 text

      class AddJobfileToInvoice < ActiveRecord::Migration
        def change
          add_column :invoices, :jobfile, :text
        end
      end
      

      就我而言,它可以工作。

      【讨论】:

      • 这对我不起作用。我也尝试使用t.string :houseimages, array: true,但它没有存储为数组,所有图像都保存在 houseimages[0] 上,而 1,2,3.. 是 nil
      • @FabrizioBertoglio,尝试删除数组:true
      猜你喜欢
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      相关资源
      最近更新 更多