我正在使用Carrierwave进行文件上传,并且有以下表格,这样我就可以提交几个文件:
<%= form_tag load_patterns_contacts_path, multipart: true, multiple: true do %>
<%= file_field_tag 'qqfile[]', id: "upload_pattern", multiple: true %>
<%= submit_tag "Load", id: "save_pattern", :class => 'btn btn-primary btn-success', multiple: true%>
<% end %>
以下是我的控制器中的代码,它将已提交的文件加载到服务器:
@uploader = EmailPatternsUploader.new
params[:qqfile].each do |p|
tempfile = open(p.original_filename)
puts tempfile
@uploader.store!(tempfile)
end
redirect_to contacts_path
flash[:success] = "Uploaded successfully."
它工作正常,如果文件名看起来像“text.xlsx”,“image.jpg”等。但如果它包含特殊符号,如“_partial.html.erb”,那么我有Errno:ENOENT(没有这样的文件或目录 - _partial.html.erb)
我试图添加
CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\_\-\+]/
在我的carrierwave.rb初始值设定项中,但没有结果。
提前感谢您的帮助!
更新:
我已经明白,问题不是特殊符号“_”,而是事实上,我试图上传的样本包含两个点(“。”)。我想我需要修改正则表达式以避免两个点
更新:
我很抱歉最后的评论。我已经理解,这个问题根本不是特殊的符号而是文件的名称。 我只能从{Rails.root}路径上传文件的问题。如果我选择另一个目录,我有上述错误,无法上传文件。如何配置Carrierwave路径目录?
答案 0 :(得分:0)
最后在我的问题上找到答案。
错误出现在这些代码串中:
params[:qqfile].each do |p|
tempfile = open(p.original_filename)
puts tempfile
@uploader.store!(tempfile)
end
我理解,我需要在Carrierwave商店中传递一个对象ActionDispatch::Http::UploadedFile!方法。这就是为什么上面提到的代码如下:
params[:qqfile].each do |p|
puts p.original_filename
puts p
@uploader.store!(p)
end
=============================================== ===================================
希望有人能够通过Carrierwave找到这个多文件上传的解决方案,而且不需要JQuery。
1)使用Carrierwave创建一个上传器。
rails g uploader EmailPatterns
2)为你的控制器创建一个自定义操作(观察Railscast#35和Railscast#38以使其清楚)并放置类似这样的内容(在我的情况下为load_patterns):
def load_patterns
@uploader = EmailPatternsUploader.new
params[:qqfile].each {|p| @uploader.store!(p)}
redirect_to contacts_path
flash[:success] = "Uploaded successfully"
end
要使其正常工作,您需要为您的操作指定自定义路由(config / routes.rb):
resources :contacts do
collection { post :load_patterns}
end
并创建一个表单,您将获得上传文件的参数(参见第3页)
3)创建表单,您需要在其中指定选项multiple:true以便允许用户选择要加载的多个文件(带[]的param名称是必要的要求,因为我们正在加载多个文件):
<%= form_tag load_patterns_contacts_path, multipart: true, multiple: true do %>
<%= file_field_tag 'qqfile[]', id: "upload_pattern", multiple: true %>
<%= submit_tag "Load", id: "save_pattern", :class => 'btn btn-primary btn-success', multiple: true%>
<% end %>
然后您的自定义操作将有效。