• jquery_file_upload in Rails(ajax实现多张图片上传)


    在此,我们要实现的是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="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="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>
  • 相关阅读:
    解决:Google代码achartengine曲线代码报错问题(转)
    操作SQLite数据库
    让服务器iis支持.apk文件下载的设置方法
    怎么在手机上查看sqlite db
    Android 3D滑动菜单完全解析,实现推拉门式的立体特效
    android自动更新程序,安装完以后就什么都没有了,没有出现安装成功的界面的问题
    那些年不错的Android开源项目
    PL/SQL Developer 连接新数据库
    Oracle 连接 Visual Studio 的工具
    利用SQLiteOpenHelper来管理SQLite数据库 (转)
  • 原文地址:https://www.cnblogs.com/feichan/p/2459385.html
Copyright © 2020-2023  润新知