Rails回形针和多个文件上传

kco*_*non 14 file-upload ruby-on-rails amazon-s3 paperclip

我正在寻找一种解决方案,让用户能够通过一个file_field上传多个图像.我已经查看了诸如Jquery File Upload和Uploadify之类的选项,但是还没有找到一个有效工作解决方案的例子.

我已经有多个图像设置,

 has_attached_file :asset,
                   :styles => { :large => "640x480", :medium => "300x300", :thumb => "100x100" },
                   :storage => :s3,
                   :s3_credentials => "#{Rails.root}/config/s3.yml",
                   :path => "/:contributor_id/:listing_name/:filename"
Run Code Online (Sandbox Code Playgroud)

现在我正在显示5个单独的file_fields

def new
  @listing = Listing.new
  5.times {@listing.assets.build }

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @listing }
  end
end
Run Code Online (Sandbox Code Playgroud)

我想拥有

<%= f.file_field :asset, :multiple => true %>
Run Code Online (Sandbox Code Playgroud)

这允许用户在其文件浏览器中选择多个文件.但是如何使用嵌套模型处理这些?并让他们上传.

小智 35

所以这里有一些问题.

首先,Paperclip的has_attached_file方法不是与许多文件的关联.看起来你正试图建立一个"资产",好像它是一个Rails协会.所有Paperclip都会在您的表中放置几个​​字段来存储有关该文件的一些元数据,并且每个声明都会获得一个附加文件has_attached_file.如果要附加5个文件,则需要执行以下操作:

has_attached_file :asset1
has_attached_file :asset2
has_attached_file :asset3
has_attached_file :asset4
has_attached_file :asset5
Run Code Online (Sandbox Code Playgroud)

或者,您也可以创建另一个模型来存储文件.例如:

class Listing < ActiveRecord::Base
  has_many :assets
end

class Asset < ActiveRecord::Base
  belongs_to :listing
  has_attached_file :picture
end
Run Code Online (Sandbox Code Playgroud)

这样,你可以将多个资产附加到一个列表中(你没有说原始对象是什么,所以我只称它为"列表").

其次,HTML中没有多文件上传的东西(因此,该file_field方法不会:multiple => true引用参数.如果你想要多文件上传,你必须使用Rails内置表单处理之外的东西上传是一个不错的选择(我以前用过).有一个gem会转换文件字段以使用uploadify(并支持:multiple => true你想要的语法):https://github.com/mateomurphy/uploadify_rails3/ wiki.但是,我不能保证它有多好.

我的建议是一步一步地开始.通过Flash上​​传到Rails可能是一个复杂的过程,涉及处理CSRF元标记和表单中的其他字段.首先制作一个允许用户上传一个文件并通过Paperclip存储的表单.然后可能将has_attached_file声明分解为另一个模型,以便您可以有一个或多个与模型关联的文件(如上面的多模型代码块所示).然后尝试添加Uploadify或其他替代方案.Ernie Miller有一个关于集成Uploadify的体面教程:http://erniemiller.org/2010/07/09/uploadify-and-rails-3/.

首先,请记住,has_attached_file只能附加一个文件.当你试着打电话时@listing.assets,没有"资产".有一个资产.如果需要多个文件,您需要自己创建一个单独的模型并使用Rails的关联.

  • 您可以在`file_field`中添加`:multiple =>"multiple"`,从一个html文件输入字段(至少在Chrome中)中选择多个文件.我还没有解决正确管理这些上传的问题,但我知道post参数包含你选择和上传的多个文件的数组. (3认同)

Cru*_*nez 6

接受的答案说,没有这样的事情,例如HTML中的多文件上传。

<%= f.file_field :files, multiple: true %>
Run Code Online (Sandbox Code Playgroud)

这使您可以选择多个图像并将其作为数组发送。

如果您具有Dog has_many Images和的关系Image has_attachment :file,请执行以下操作以一次上传多个图像:

在你的html.erb中

<%= form_for @dog, html: { multipart: true } do |f| %>
  <%= f.file_field :files, accept: 'image/png,image/jpeg,image/gif', multiple: true %>
<%= end %>
Run Code Online (Sandbox Code Playgroud)

在您的控制器中

def dog_params
  params.require(:dog).permit files: []
end
Run Code Online (Sandbox Code Playgroud)

在你的狗模型中

def files=(array = [])
  array.each do |f|
    images.create file: f
  end
end
Run Code Online (Sandbox Code Playgroud)

这是假设您已经可以上传一张图片,但想一次升级到多张图片。请注意,等待时间将增加。

为了减少等待时间,请在有关快速上传的问题上浏览我的帖子