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的关联.
接受的答案说,没有这样的事情,例如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)
这是假设您已经可以上传一张图片,但想一次升级到多张图片。请注意,等待时间将增加。
为了减少等待时间,请在有关快速上传的问题上浏览我的帖子。
| 归档时间: |
|
| 查看次数: |
18044 次 |
| 最近记录: |