【发布时间】:2020-04-15 16:31:29
【问题描述】:
我正在按照https://github.com/carrierwaveuploader/carrierwave/blob/master/README.md#multiple-file-uploads上的说明进行操作
特别是这条线给我带来了麻烦(我认为):
<% user.avatars.each do |avatar| %>
<%= hidden_field :user, :avatars, multiple: true, value: avatar.identifier %>
<% end %>
<%= form.file_field :avatars, multiple: true %>
我有一个名为 properties 的表和一个名为 property_units 的相关表,它们是使用 Cocoon gem 的属性上的嵌套字段。
property_units 有载波文件列。
对于我在视图上输入的文件,我有以下内容:
_property_unit_fields.html.erb
<% if f.object.files.count > 0 %>
<div class="uploaded-files">
<% f.object.files.each do |file| %>
<%= f.hidden_field :files, multiple: true, value: file.file.identifier %>
<p>
<span><%= file.file.filename %></span>
</p>
<% end %>
</div>
<% end %>
<%= f.file_field :files, multiple: true %>
</div>
上述案例中的f 来自这个 Cocoon 实现:
<div id="property_units">
<%= f.fields_for :property_units do |unit| %>
<%= render 'property_unit_fields', f: unit %>
<% end %>
<div class='links'>
<%= link_to_add_association 'Add Unit', f, :property_units, class: 'button button--tertiary' %>
</div>
</div>
我能够保存文件,并且安装的上传器可以正常工作。我可以保存多个,但如果我再次上传,以前的文件将被完全替换。
例如,我刚刚上传了一个名为“tickets.pdf”的文件。该文件在数据库中。
隐藏的输入呈现为:
<input multiple="multiple" value="tickets.pdf" type="hidden" name="property[property_units_attributes][0][files][]" id="property_property_units_attributes_0_files">
一旦我上传了一个新文件,“tickets.pdf”就会被删除。
我做错了什么?
编辑,这是上传时的日志
已存在并在隐藏输入中引用的文件是tickets.pdf,新上传的文件是ActionDispatch。
很明显,它正在发送一个字符串,而 Carrierwave 需要一个文件。但这就是文档规定要做的事情。所以我不知道还应该在请求中放置什么
"files"=>["tickets.pdf", #<ActionDispatch::Http::UploadedFile:0x00007fd6dc275118 @tempfile=#<Tempfile:/tmp/RackMultipart20200415-3213-10sfy1b.pdf>, @original_filename="somefile.pdf", @content_type="application/pdf", @headers="Content-Disposition: form-data; name=\"property[property_units_attributes][0][files][]\"; filename=\"somefile.pdf\"\r\nContent-Type: application/pdf\r\n">], "_destroy"=>"false", "id"=>"1"}},
所以现在“somefile.pdf”是我拥有的唯一文件,在 DB 列中它看起来像 {NULL,"\"somefile.pdf\""}
NULL 是门票
【问题讨论】:
-
我遇到了同样的问题,对我来说它是通过更新carrierwave来解决的。 2.0 重新设计了多个文件上传,我们使用的是旧版本。见github.com/carrierwaveuploader/carrierwave/issues/2393。