项目作者: huobazi

项目描述 :
使用 AjaxUpload 和 Carrierwave 在 Rails && Mongoid 中批量上传图片
高级语言: Ruby
项目地址: git://github.com/huobazi/ajax-upload-with-carrierwave-mongoid.git


Ajax Upload With Carrierwave and Mongoid

file-uploader 是一个用 Javascrit 编写的文件上传 Libary,在这里我使用 CarrierWaveMongoid 来完成多文件的无刷新上传功能

RubyGems

  1. gem 'mongoid', '3.0.4'
  2. gem 'carrierwave', '0.6.2'
  3. gem 'carrierwave-mongoid', :github => 'jnicklas/carrierwave-mongoid', :branch => 'mongoid-3.0'
  4. gem 'mini_magick', '3.4'
  5. gem 'rack-raw-upload', '1.1.0'

application.rb

config.middleware.use ‘Rack::RawUpload’

Model

  1. class Screenshot
  2. include Mongoid::Document
  3. include Mongoid::Timestamps::Created
  4. include Rails.application.routes.url_helpers
  5. attr_accessible :image
  6. field :image
  7. mount_uploader :image, ScreenshotUploader
  8. end

Controller

  1. class ScreenshotsController < ApplicationController
  2. def index
  3. @screenshots = Screenshot.all.desc(:created_at)
  4. respond_to do |format|
  5. format.html # index.html.erb
  6. format.js{ render :layout => false}
  7. end
  8. end
  9. def create
  10. file = params[:qqfile].is_a?(ActionDispatch::Http::UploadedFile) ? params[:qqfile] : params[:file]
  11. @screenshot = Screenshot.new
  12. @screenshot.image = file
  13. if @screenshot.save
  14. render json: { success: true, src: @screenshot.to_json }
  15. else
  16. render json: @screenshot.errors.to_json
  17. end
  18. end
  19. def destroy
  20. @screenshot = Screenshot.find(params[:id])
  21. @screenshot.destroy
  22. respond_to do |format|
  23. format.html { redirect_to screenshots_path }
  24. format.js{
  25. @screenshots = Screenshot.all.desc(:created_at)
  26. render :layout => false
  27. }
  28. end
  29. end
  30. end

Uploader

  1. # encoding: utf-8
  2. require "digest/md5"
  3. require 'carrierwave/processing/mini_magick'
  4. class ScreenshotUploader < CarrierWave::Uploader::Base
  5. include CarrierWave::MiniMagick
  6. storage :file
  7. # Override the directory where uploaded files will be stored.
  8. def store_dir
  9. "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  10. end
  11. process :convert => 'png'
  12. # Create different versions of your uploaded files:
  13. version :thumb do
  14. process :resize_to_fill => [120, 120]
  15. end
  16. # Add a white list of extensions which are allowed to be uploaded.
  17. def extension_white_list
  18. %w(jpg jpeg gif png)
  19. end
  20. # Override the filename of the uploaded files:
  21. # see http://huacnlee.com/blog/carrierwave-upload-store-file-name-config/
  22. def filename
  23. if super.present?
  24. # current_path 是 Carrierwave 上传过程临时创建的一个文件,有时间标记,所以它将是唯一的
  25. @name ||= Digest::MD5.hexdigest(File.dirname(current_path))
  26. "#{@name}.#{file.extension.downcase}"
  27. end
  28. end
  29. end

Javascript

  1. $(document).ready(function(){
  2. var uploader = new qq.FileUploader({
  3. debug: true,
  4. allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'],
  5. sizeLimit: 1048576, // max size: 1MB
  6. minSizeLimit: 0, // min size
  7. multiple: true,
  8. element: document.getElementById('file-uploader'),
  9. action: '<%= screenshots_path %>',
  10. onComplete: function(id, fileName, responseJSON){
  11. $.getScript("<%= screenshots_path %>");
  12. },
  13. onSubmit: function(id, fileName) {
  14. uploader.setParams({
  15. xx: "xx",
  16. yy: 'yy',
  17. zz: 'zz',
  18. authenticity_token: "<%= form_authenticity_token.to_s %>"
  19. });
  20. }
  21. });
  22. });