Rails的回形针和多文件上传(Rails Paperclip & Multiple File Up

2019-06-25 06:13发布

我在寻找一个解决方案给用户通过一个是,file_field上传多张图片的能力。 我特地到选项,例如jQuery的文件上传和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"

现在我展示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

我想拥有

<%= f.file_field :asset, :multiple => true %>

这允许用户选择自己的文件浏览器多个文件。 但是,我怎么能有一个嵌套的模型来处理这些? 并让他们上传。

Answer 1:

因此,有一些问题在这里。

首先,回形针的has_attached_file方法是不是关联到多个文件。 它看起来像你试图建立一个“资产”,仿佛它是一个Rails的关联。 所有的回形针也被放了几个字段到您的表来存储一些元数据有关的文件,你会得到每声明中的一个附加文件has_attached_file 。 如果您要附加5个文件,你需要做的是这样的:

has_attached_file :asset1
has_attached_file :asset2
has_attached_file :asset3
has_attached_file :asset4
has_attached_file :asset5

或者,你可以创建另一个模型只是来存储文件。 例如:

class Listing < ActiveRecord::Base
  has_many :assets
end

class Asset < ActiveRecord::Base
  belongs_to :listing
  has_attached_file :picture
end

通过这种方式,你可以有连接到一个上市多个资产(你没有说原来的目标是什么,所以我只是把它叫做“上市”)。

第二,在HTML中的多文件上传(和,因此没有这样的事,则file_field方法不采取:multiple => true争论你将不得不使用一些超越内置的形式处理,如果导轨。你要多文件上传uploadify是一个不错的选择(我曾经使用过)有,将改变文件字段使用uploadify(和将支持一个宝石。 :multiple => true要语法): HTTPS ://github.com/mateomurphy/uploadify_rails3/wiki ,但是我不能保证它有多好。

我的建议是,开始一步一步的。 通过Flash上​​传到Rails可以是涉及到处理您的形式CSRF元标记等领域的复杂过程。 通过使一个表单,允许用户通过上传回形针一个文件,并将其存储启动。 那么也许打破has_attached_file声明到另一个模型,以便可以有1名或多个与模型关联的文件(如示出在多型号代码块以上)。 然后尝试添加Uploadify或另一种选择。 厄尼·米勒对整合Uploadify一个像样的教程: http://erniemiller.org/2010/07/09/uploadify-and-rails-3/ 。

首先,请记住, has_attached_file只能附加一个文件。 当你尝试调用@listing.assets没有“资产”。 有一种资产。 你需要自己创建一个单独的模型,并使用Rails的协会,如果你想多个文件。



Answer 2:

接受的回答说,有作为HTML多文件上传这样的东西。

<%= f.file_field :files, multiple: true %>

这使您可以选择多个图像并将它们作为一个数组。

如果你有关系, Dog has_many ImagesImage 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 %>

在您的控制器

def dog_params
  params.require(:dog).permit files: []
end

在你的狗模型

def files=(array = [])
  array.each do |f|
    images.create file: f
  end
end

这是假设你已经能够上传一个图片,但要升级到多个图像一次。 请注意,等待时间会增加。

为了帮助减少等待时间,偷看我的岗位在这个问题上与速度上传。



Answer 3:

下面是多文件上传的完整的例子。 这里一个user has_many uploads 。 每个upload模型有一个avatar代表文件附件。 最后:我们正在创造很多uploads当我们创建的user

模特

#models/user.rb
class User < ApplicationRecord
  has_many :uploads

  def files=(array_of_files = [])
    array_of_files.each do |f|
      uploads.build(avatar: f, user: self)
    end
  end
end


#models/upload.rb
class Upload < ApplicationRecord
  belongs_to :user

  has_attached_file :avatar
  validates_attachment_content_type :avatar, :content_type => ["image/png"]
end

表格:

# views/users/_form.html.erb
<%= form_with(model: user, local: true) do |form| %>

  ...

  <div class="field">
    <%= form.file_field :files, multiple: true %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

该控制器

class UsersController < ApplicationController
  before_action :set_user, only: [:show]

  def show
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)

    if @user.save
      redirect_to @user, notice: 'User was successfully created.'
    end
  end

  private
    def set_user
      @user = User.find(params[:id])
    end

    def user_params
      params.require(:user).permit(:name, files: [])
    end
end

用户#秀

<p id="notice"><%= notice %></p>

<p>
  <strong>Name:</strong>
  <%= @user.name %>
</p>


<h3>Uploads</h3>
<div>
  <% @user.uploads.each do |upload|  %>
    <div>
      <%= link_to upload.avatar.url do%>
        <%= upload.avatar_file_name %>
      <% end %>
    </div>
  <% end %>
</div>

<%= link_to 'Edit', edit_user_path(@user) %> |
<%= link_to 'Back', users_path %>


文章来源: Rails Paperclip & Multiple File Uploads