在此,我们要实现的是http://blueimp.github.com/jQuery-File-Upload/上传功能和效果。
1.准备工作
关键gem:carrierwave 和rmagick
在安装rmagick这个gem之前需要安装ImageMagick和相关库ImageMagick和
ImageMagick-devel,直接yum install
下载关键js库函数和css
http://blueimp.github.com/jQuery-File-Upload/在这里有完全的下载,
jquery.iframe-transport.js
jquery.ui.widget.js
jquery.fileupload.js
jquery.fileupload-ip.js
jquery.fileupload-ui.js
locale.js
2.创建uploader
在Gemfile中添加
gem 'rmagick' gem 'carrierwave'
bundle install
rails g uploader image
修改生成的image_uploader.rb
include CarrierWave::RMagick # Create different versions of your uploaded files: version :thumb do process :resize_to_limit => [100, 100] end
修改这里是为了生成thumb图片。
3.生成picture的scaffold
rails g scaffold picture image:string
修改model
class Picture < ActiveRecord::Base attr_accessible :image include Rails.application.routes.url_helpers mount_uploader :image, AvatarUploader #关联uploader #one convenient method to pass jq_upload the necessary information def to_jq_upload { "name" => read_attribute(:image), "size" =>image.size, "url" =>image.url, "thumbnail_url" =>image.thumb.url, "delete_url" => picture_path(:id => id), "delete_type" => "DELETE" } end end
修改controller
class PicturesController < ApplicationController def index @pictures = Picture.all render :json => @pictures.collect { |p| p.to_jq_upload }.to_json end def new end def create @picture = Picture.new(params[:picture]) if @picture.save respond_to do |format| format.html { render :json => [@picture.to_jq_upload].to_json, :content_type => 'text/html', :layout => false } format.json { render :json => [@picture.to_jq_upload].to_json } end else render :json => [{:error => "custom_failure"}], :status => 304 end end def destroy @picture = Picture.find(params[:id]) @picture.destroy render :json => true end end
修改new.html.reb
<!-- Bootstrap CSS Toolkit styles --> <link rel="stylesheet" href="http://blueimp.github.com/cdn/css/bootstrap.min.css"> <!-- Bootstrap styles for responsive website layout, supporting different screen sizes --> <link rel="stylesheet" href="http://blueimp.github.com/cdn/css/bootstrap-responsive.min.css"> <!-- Bootstrap CSS fixes for IE6 --> <!--[if lt IE 7]><link rel="stylesheet" href="http://blueimp.github.com/cdn/css/bootstrap-ie6.min.css"><![endif]--> <!-- Bootstrap Image Gallery styles --> <link rel="stylesheet" href="http://blueimp.github.com/Bootstrap-Image-Gallery/css/bootstrap-image-gallery.min.css"> <!-- Shim to make HTML5 elements usable in older Internet Explorer versions --> <!--[if lt IE 9]><script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]--> <h2><%= t('photos.title') %></h2> <%= form_for Picture.new, :html => { :multipart => true, :id => "fileupload" } do |f| %> <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload --> <div class="row fileupload-buttonbar"> <div class="span7"> <!-- The fileinput-button span is used to style the file input field as button --> <span class="btn btn-success fileinput-button"> <i class="icon-plus icon-white"></i> <span>Add files...</span> <%= f.file_field :image %> </span> <button type="submit" class="btn btn-primary start"> <i class="icon-upload icon-white"></i> <span>Start upload</span> </button> <button type="reset" class="btn btn-warning cancel"> <i class="icon-ban-circle icon-white"></i> <span>Cancel upload</span> </button> <button type="button" class="btn btn-danger delete"> <i class="icon-trash icon-white"></i> <span>Delete</span> </button> <input type="checkbox" class="toggle"> </div> <div class="span5"> <!-- The global progress bar --> <div class="progress progress-success progress-striped active fade"> <div class="bar" style="width:0%;"></div> </div> </div> </div> <!-- The loading indicator is shown during image processing --> <div class="fileupload-loading"></div> <br> <!-- The table listing the files available for upload/download --> <table class="table table-striped"><tbody class="files" data-toggle="modal-gallery" data-target="#modal-gallery"></tbody> </table> <% end %> <script> var fileUploadErrors = { maxFileSize: 'File is too big', minFileSize: 'File is too small', acceptFileTypes: 'Filetype not allowed', maxNumberOfFiles: 'Max number of files exceeded', uploadedBytes: 'Uploaded bytes exceed file size', emptyResult: 'Empty file upload result' }; </script> <!-- The template to display files available for upload --> <script id="template-upload" type="text/x-tmpl"> {% for (var i=0, file; file=o.files[i]; i++) { %} <tr class="template-upload fade"> <td class="preview"><span class="fade"></span></td> <td class="name"><span>{%=file.name%}</span></td> <td class="size"><span>{%=o.formatFileSize(file.size)%}</span></td> {% if (file.error) { %} <td class="error" colspan="2"><span class="label label-important">{%=locale.fileupload.error%}</span> {%=locale.fileupload.errors[file.error] || file.error%}</td> {% } else if (o.files.valid && !i) { %} <td> <div class="progress progress-success progress-striped active"><div class="bar" style="width:0%;"></div></div> </td> <td class="start">{% if (!o.options.autoUpload) { %} <button class="btn btn-primary"> <i class="icon-upload icon-white"></i> <span>{%=locale.fileupload.start%}</span> </button> {% } %}</td> {% } else { %} <td colspan="2"></td> {% } %} <td class="cancel">{% if (!i) { %} <button class="btn btn-warning"> <i class="icon-ban-circle icon-white"></i> <span>{%=locale.fileupload.cancel%}</span> </button> {% } %}</td> </tr> {% } %} </script> <!-- The template to display files available for download --> <script id="template-download" type="text/x-tmpl"> {% for (var i=0, file; file=o.files[i]; i++) { %} <tr class="template-download fade"> {% if (file.error) { %} <td></td> <td class="name"><span>{%=file.name%}</span></td> <td class="size"><span>{%=o.formatFileSize(file.size)%}</span></td> <td class="error" colspan="2"><span class="label label-important">{%=locale.fileupload.error%}</span> {%=locale.fileupload.errors[file.error] || file.error%}</td> {% } else { %} <td class="preview">{% if (file.thumbnail_url) { %} <a href="{%=file.url%}" title="{%=file.name%}" rel="gallery" download="{%=file.name%}"><img src="{%=file.thumbnail_url%}"></a> {% } %}</td> <td class="name"> <a href="{%=file.url%}" title="{%=file.name%}" rel="{%=file.thumbnail_url&&'gallery'%}" download="{%=file.name%}">{%=file.name%}</a> </td> <td class="size"><span>{%=o.formatFileSize(file.size)%}</span></td> <td colspan="2"></td> {% } %} <td class="delete"> <button class="btn btn-danger" data-type="{%=file.delete_type%}" data-url="{%=file.delete_url%}"> <i class="icon-trash icon-white"></i> <span>{%=locale.fileupload.destroy%}</span> </button> <input type="checkbox" name="delete" value="1"> </td> </tr> {% } %} </script> <!-- The jQuery UI widget factory, can be omited if jQuery UI is already included --> <%= javascript_include_tag "jquery.ui.widget.js" %> <!-- The Templates plugin is included to render the upload/download listings --> <script src="http://blueimp.github.com/JavaScript-Templates/tmpl.min.js"></script> <!-- The Load Image plugin is included for the preview images and image resizing functionality --> <script src="http://blueimp.github.com/JavaScript-Load-Image/load-image.min.js"></script> <!-- The Canvas to Blob plugin is included for image resizing functionality --> <script src="http://blueimp.github.com/JavaScript-Canvas-to-Blob/canvas-to-blob.min.js"></script> <!-- Bootstrap JS and Bootstrap Image Gallery are not required, but included for the demo --> <script src="http://blueimp.github.com/cdn/js/bootstrap.min.js"></script> <script src="http://blueimp.github.com/Bootstrap-Image-Gallery/js/bootstrap-image-gallery.min.js"></script> <!-- The Iframe Transport is required for browsers without support for XHR file uploads --> <%= javascript_include_tag "jquery.iframe-transport.js" %> <!-- The basic File Upload plugin --> <%= javascript_include_tag "jquery.fileupload.js" %> <!-- The File Upload image processing plugin --> <%= javascript_include_tag "jquery.fileupload-ip.js" %> <!-- The File Upload user interface plugin --> <%= javascript_include_tag "jquery.fileupload-ui.js" %> <!-- The localization script --> <%= javascript_include_tag "locale.js" %> <!-- The XDomainRequest Transport is included for cross-domain file deletion for IE8+ --> <!--[if gte IE 8]><%= javascript_include_tag "jquery.xdr-transport.js" %><![endif]--> <script type="text/javascript" charset="utf-8"> $(function () { // Initialize the jQuery File Upload widget: $('#fileupload').fileupload(); // // Load existing files: $.getJSON($('#fileupload').prop('action'), function (files) { var fu = $('#fileupload').data('fileupload'), template; fu._adjustMaxNumberOfFiles(-files.length); template = fu._renderDownload(files) .appendTo($('#fileupload .files')); // Force reflow: fu._reflow = fu._transition && template.length && template[0].offsetWidth; template.addClass('in'); $('#loading').remove(); }); }); </script>