Rails 3-2。多个文件上传。 Ruby问题

时间:2013-11-12 13:00:32

标签: ruby-on-rails ruby ruby-on-rails-3 carrierwave

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

1 个答案:

答案 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#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以便允许用户选择要加载的多个文件(带[]的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 %>

然后您的自定义操作将有效。