使用回形针上传多个文件 [英] Uploading multiple files with paperclip
问题描述
我在使用回形针上传多个文件时遇到问题,
我的模型就是这样
slider has_many imgarraysimgarrays has_many imageobjectsimageobjects have_attachment(对于回形针)
我在其他模型上接收单个图像并使用回形针保存它没有问题,但我不确定如何在多个文件上传期间处理由 imgarrays
参数返回的数组.
这是我的 rails 服务器日志:
在 2012-07-23 10:14:17 +0800 开始为 127.0.0.1 POST "/slider"由 SliderController#create 处理为 HTML参数:{"utf8"=>"✓", "authenticity_token"=>"7HcHtSlOsU/bnxb9emhAsSl/GFBraIE6NxwijHl3REM=", "slider"=>{"question"=>"", "answer"=>"", "score"=>"", "industry_name"=>"","imgarrays"=>[#<ActionDispatch::Http::UploadedFile:0x007fb471e99f30 @original_filename="Icon.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"slider[imgarrays][]\"; filename=\"Icon.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/2s/n9wb5x4534nfs1cbrlph32v00000gp/T/RackMultipart20120723-53499-1lyi4yf>,#<ActionDispatch::Http::UploadedFile:0x007fb471e2name."Content-Disposition: form-data; name=\"slider[imgarrays][]\"; filename=\"Icon@2x.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/2s/n9wb5x4534nfs1cbrlph32v00000gp/T/RackMultipart20120723-53499-10lala2>>, #<ActionDispatch::Http::Uploaded6e_png5name,@green_file.png5"="image/png", @headers="Content-Disposition: form-data; name=\"slider[imgarrays][]\"; filename=\"greenButton.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/2s/n9wb5x4534nfs1cbrlph32v00000gp/T/RackMultipart20120723-53499-or2rdk>>]}, "commit"="Create!"}在 18 毫秒内完成 500 个内部服务器错误ActiveRecord::AssociationTypeMismatch (Imgarray(#70206507050500) 预期,得到 ActionDispatch::Http::UploadedFile(#70206487229960)):应用程序/控制器/slider_controller.rb:12:in `new'应用程序/控制器/slider_controller.rb:12:in`创建'渲染/Users/Kinnovate/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.4ms)渲染/Users/Kinnovate/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.4ms)在救援/布局中渲染/Users/Kinnovate/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb(6.5ms)
滑块的new.html.erb
<%= form_for @slider ,:url=>"/slider" , :html =>{ :multipart =>真 } 做 |f|%><%= f.label :question , "question"%><%= f.text_field :question %></br><%= f.label :answer , "答案数组(逗号分隔)"%><%= f.text_field :answer %></br><%= f.label :score , "score"%><%= f.text_field :score %></br><%= f.label :industry_name , "industry"%><%= f.text_field :industry_name %></br><%= f.label :attachedimg , "image"%><%= f.file_field :imgarrays, :multiple =>:true %></br><%= f.submit "Create", class: "btn btn-large btn-primary" %><%结束%><%= link_to '取消',slider_index_path %>
这是我的代码,它可以很好地使用回形针上传多个文件:我们可以使用嵌套属性或使用普通的简单方法来实现.
以下代码显示了正常方法:
用户.rb
<块引用>has_many :images, :dependent =>:摧毁
图片.rb
<块引用>has_attached_file :avatar, :styles =>{:中 =>300x300""}
属于:用户
users/views/new.html.erb
<%= form_for @user, :html =>{ :multipart =>真 } 做 |f|%>..........<%= file_field_tag :avatar, multiple: true %><%结束%>
Users_controller:
.....
如果@user.save# params[:avatar] 将是一个数组.# 您可以使用 params[:avatar].count 检查选择的照片总数params[:avatar].each do |图片|@user.images.create(:avatar=>图片)# 不要忘记提及:avatar(field name)结尾结尾
就是这样.图像已上传,这可能不是好方法,但它有效.
I am having problems uploading multiple files using paper clip,
my models are as such
slider has_many imgarrays
imgarrays has_many imageobjects
imageobjects have_attachment(as for paperclip)
I have no problems receiving a single image and saving it using paperclip on my other models, but i am not sure of how to handle the array returned by imgarrays
param during a multiple file upload.
Here is my rails server logs:
Started POST "/slider" for 127.0.0.1 at 2012-07-23 10:14:17 +0800
Processing by SliderController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"7HcHtSlOsU/bnxb9emhAsSl/GFBraIE6NxwijHl3REM=", "slider"=>{"question"=>"", "answer"=>"", "score"=>"", "industry_name"=>"",
"imgarrays"=>[#<ActionDispatch::Http::UploadedFile:0x007fb471e99f30 @original_filename="Icon.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"slider[imgarrays][]\"; filename=\"Icon.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/2s/n9wb5x4534nfs1cbrlph32v00000gp/T/RackMultipart20120723-53499-1lyi4yf>>, #<ActionDispatch::Http::UploadedFile:0x007fb471e99dc8 @original_filename="Icon@2x.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"slider[imgarrays][]\"; filename=\"Icon@2x.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/2s/n9wb5x4534nfs1cbrlph32v00000gp/T/RackMultipart20120723-53499-10lala2>>, #<ActionDispatch::Http::UploadedFile:0x007fb471e99d50 @original_filename="greenButton.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"slider[imgarrays][]\"; filename=\"greenButton.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/2s/n9wb5x4534nfs1cbrlph32v00000gp/T/RackMultipart20120723-53499-or2rdk>>]}, "commit"=>"Create!"}
Completed 500 Internal Server Error in 18ms
ActiveRecord::AssociationTypeMismatch (Imgarray(#70206507050500) expected, got ActionDispatch::Http::UploadedFile(#70206487229960)):
app/controllers/slider_controller.rb:12:in `new'
app/controllers/slider_controller.rb:12:in `create'
Rendered /Users/Kinnovate/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.4ms)
Rendered /Users/Kinnovate/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.4ms)
Rendered /Users/Kinnovate/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (6.5ms)
new.html.erb for slider
<div>
<%= form_for @slider ,:url=>"/slider" , :html => { :multipart => true } do |f| %>
<%= f.label :question , "question"%>
<%= f.text_field :question %> </br>
<%= f.label :answer , "answer array (comma seperated)"%>
<%= f.text_field :answer %> </br>
<%= f.label :score , "score"%>
<%= f.text_field :score %> </br>
<%= f.label :industry_name , "industry"%>
<%= f.text_field :industry_name %> </br>
<%= f.label :attachedimg , "image"%>
<%= f.file_field :imgarrays, :multiple =>:true %> </br>
<%= f.submit "Create", class: "btn btn-large btn-primary" %>
<% end %>
</div>
<%= link_to 'Cancel', slider_index_path %>
Here is my code that worked well to upload multiple file using paperclip: We can achieve using nested attributes or using normal easy method.
The following code shows normal method:
User.rb
has_many :images, :dependent => :destroy
Image.rb
has_attached_file :avatar, :styles => { :medium => "300x300>" }
belongs_to :user
users/views/new.html.erb
<%= form_for @user, :html => { :multipart => true } do |f| %>
......
....
<%= file_field_tag :avatar, multiple: true %>
<% end %>
Users_controller:
.....
if @user.save
# params[:avatar] will be an array.
# you can check total number of photos selected using params[:avatar].count
params[:avatar].each do |picture|
@user.images.create(:avatar=> picture)
# Don't forget to mention :avatar(field name)
end
end
Thats it. images got uploaded, this may not be the good way but it works.
这篇关于使用回形针上传多个文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!