1

我正在使用 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 路径目录?

4

1 回答 1

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#35Railscast#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 以允许用户选择要加载的多个文件(带 [ ] 的参数名称是必要的要求,因为我们正在加载多个文件):

    <%= 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 %>

然后您的自定义操作将起作用。

于 2013-11-13T05:54:15.193 回答