用蜻蜓多个图像上传

ana*_*and 7 image-uploading ruby-on-rails-3 dragonfly-gem

我正在尝试使用rails3中的dragonfly进行多个图像上传.我搜索了一些教程,但找不到任何教程.我找到了一个用Carrierwave上传多个图像的教程,但是找不到运气蜻蜓..任何帮助请:)

Flo*_*ian 10

前言

一般来说,Dragonfly本身可用于管理项目的媒体,类似于回形针.问题本身归结为rails应用程序中的多文件上传.有关该主题的一些教程可以很容易地适用于使用Dragonfly存储特定文件的模型.我建议你研究一下,并尝试根据你的项目进行调整.

但是,我可以提供一个最小的例子,我为当前正在开发的rails 3.2应用程序构建,这不是完美的(例如验证处理),但可以给你一些起点.

仅供参考,从这里获取基本思路.这个例子是用Rails 3.2.x完成的.

假设您有一个度假数据库,用户可以在假期数据库中创建旅行报告.他们可能会留下一些小描述,以及一些图片.

首先为旅行构建一个简单的基于ActiveRecord的模型Trip,现在就调用它:

class Trip < ActiveRecord::Base
    has_many :trip_images
    attr_accessible :description, :trip_images
end
Run Code Online (Sandbox Code Playgroud)

如您所见,该模型通过has_many关联附加了旅行图像.让我们快速浏览一下TripImage模型,该模型使用dragonfly将文件存储在内容字段中:

class TripImage < ActiveRecord::Base
    attr_accessible :content, :trip_id
    belongs_to :trip_id

    image_accessor :content
end
Run Code Online (Sandbox Code Playgroud)

它自己存储文件附件的旅行图像.您可以在此模型中放置任何约束,例如文件大小或mime类型.

让我们创建一个TripController有一个new和一个create动作(你可以通过脚手架生成,如果你喜欢,它是迄今为止没什么特别的):

class TripController < ApplicationController
    def new
        @trip = Trip.new
    end

    def create 
        @trip = Trip.new(params[:template])

        #create the images from the params
        unless params[:images].nil?
            params[:images].each do |image|
            @trip.trip_images << TripImages.create(:content => image)
        end
        if @trip.save
            [...] 
    end
end
Run Code Online (Sandbox Code Playgroud)

这里没什么特别的,除了从params哈希以外的其他条目创建图像.查看new.html.erb模板文件中的文件上载字段(或用于Trip模型中字段的部分)时,这是有意义的:

[...]
<%= f.file_field :trip_images, :name => 'images[]', :multiple => true %>
[...]
Run Code Online (Sandbox Code Playgroud)

这应该适用于当下,但是,现在对此图像没有限制.您可以通过模型上的自定义验证器限制服务器端的图像数量Trip:

class Trip < ActiveRecord::Base
    has_many :trip_images
    attr_accessible :description, :trip_images
    validate :image_count_in_bounds, :on => :create

protected
    def image_count_in_bounds
        return if trip_images.blank?
        errors.add("Only 10 images are allowed!") if trip_images.length > 10
    end
end
Run Code Online (Sandbox Code Playgroud)

我把这个留给你,但你也可以在文件字段上使用客户端验证,一般的想法是在更改文件字段时检查文件(在CoffeeScript中):

jQuery ->
    $('#file_field_id').change () ->
         #disable the form
         for file in this.files
             #check each file  
         #enable the form
Run Code Online (Sandbox Code Playgroud)

摘要

你可以建立很多从现有的教程,如蜻蜓不表现不同的方式对其他的解决方案,当谈到刚刚在上传文件.但是,如果你想要更高级的东西,我会建议jQuery Fileupload,就像许多其他人在我面前一样.

无论如何,我希望我能提供一些见解.