【问题标题】:Rails 3-2. Multiple file uploading. Ruby issue导轨 3-2。多文件上传。红宝石问题
【发布时间】:2013-11-13 13:54:15
【问题描述】:

我正在使用 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 初始化程序中,但它没有给出任何结果。

提前感谢您的帮助!

更新:

我明白,问题不是特殊符号“_”,而是事实上,我尝试上传的样本包含两个点(“.”)。我想我需要修改正则表达式以避免两个点

更新:

我为最后的 cmets 感到抱歉。我明白,这件事根本不是特殊符号,也不是文件名。 我只能从 {Rails.root} 路径上传文件的问题。如果我选择另一个目录,则会出现上述错误并且无法上传文件。如何配置载波路径目录?

【问题讨论】:

  • 检查了rubular上的表达式?

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


【解决方案1】:

终于找到我的问题的答案了。

错误出现在这些代码字符串中:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多