`
coconut_zhang
  • 浏览: 542068 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

plupload实现多图片上传

 
阅读更多

最近发现一个非常牛的上传组件(http://www.plupload.com/documentation.php),前端根据浏览器不同选择使用Html5、 Gears, Silverlight, Flash, BrowserPlus来对文件进行客户端优化,比如大图片的压缩,大文件分块上传,简直是太牛了,还有上传进度条、多文件上传等。官方网 站:http://plupload.com/,下载的domo是php版本的,于是我弄了个java版本的,分享给大家,

前端js等文件去下载个domo就有了,后端使用到了commons-fileupload-1.2.2.jar这个包。

前端html:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<title>plupload</title> 
<!-- 配置界面上的css --> 
<link rel="stylesheet" type="text/css" href="plupload/jquery.plupload.queue/css/jquery.plupload.queue.css"> 
<script type="text/javascript" src="js/jquery-1.6.2.min.js"></script> 
<script type="text/javascript" src="plupload/plupload.full.js"></script> 
<script type="text/javascript" src="plupload/jquery.plupload.queue/jquery.plupload.queue.js"></script> 
<!-- 国际化中文支持 --> 
<script type="text/javascript" src="plupload/i18n/cn.js"></script> 

<script type="text/javascript"> 
/* Convert divs to queue widgets when the DOM is ready */ 
$(function(){ 
    function plupload(){ 
        $("#uploader").pluploadQueue({ 
            // General settings 
            runtimes : 'html5,gears,browserplus,silverlight,flash,html4', 
            url : 'servlet/fileUpload', 
            max_file_size : '10mb', 
            unique_names: true, 
            chunk_size: '2mb', 
            // Specify what files to browse for 
            filters : [ 
                {title: "Image files", extensions: "jpg,gif,png"}, 
                {title: "Zip files", extensions: "zip"} 
            ], 
            resize: {width: 640, height: 480, quality: 90}, 
            // Flash settings 
            flash_swf_url: 'plupload/plupload.flash.swf', 
            // Silverlight settings 
            silverlight_xap_url: 'plupload/plupload.silverlight.xap', 
            // 参数 
            multipart_params: {'user': 'Rocky', 'time': '2012-06-12'} 
        }); 
    } 
    plupload(); 
    $('#Reload').click(function(){ 
        plupload(); 
    }); 
}); 
</script> 
<div style="width:750px; margin:0 auto"> 
    <form id="formId" action="Submit.action" method="post"> 
        <div id="uploader"> 
            <p>您的浏览器未安装 Flash, Silverlight, Gears, BrowserPlus 或者支持 HTML5 .</p> 
        </div> 
        <input value="重新上传" id="Reload" type="button"> 
    </form> 
</div> 

 后端

package com.rock; 
import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import javax.servlet.ServletException; 
import javax.servlet.ServletOutputStream; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.apache.commons.fileupload.FileItemIterator; 
import org.apache.commons.fileupload.FileItemStream; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import org.apache.commons.fileupload.util.Streams; 
public class FileUploadAction extends HttpServlet { 
    private static final long serialVersionUID = 3447685998419256747L; 
    private static final String RESP_SUCCESS = "{\"jsonrpc\" : \"2.0\", \"result\" : \"success\", \"id\" : \"id\"}"; 
    private static final String RESP_ERROR = "{\"jsonrpc\" : \"2.0\", \"error\" : {\"code\": 101, \"message\": \"Failed to open input stream.\"}, \"id\" : \"id\"}"; 
    public static final String JSON = "application/json"; 
    public static final int BUF_SIZE = 2 * 1024; 
    public static final String FileDir = "uploadfile/"; 
    private int chunk; 
    private int chunks; 
    private String name; 
    private String user; 
    private String time; 
    /** 
     * Handles an HTTP POST request from Plupload. 
     *  
     * @param req The HTTP request 
     * @param resp The HTTP response 
     */ 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
        String responseString = RESP_SUCCESS; 
        boolean isMultipart = ServletFileUpload.isMultipartContent(req); 
        if(isMultipart){ 
            ServletFileUpload upload = new ServletFileUpload(); 
            try { 
                FileItemIterator iter = upload.getItemIterator(req); 
                while (iter.hasNext()) { 
                    FileItemStream item = iter.next(); 
                    InputStream input = item.openStream(); 
                    // Handle a form field. 
                    if(item.isFormField()){ 
                        String fileName = item.getFieldName(); 
                        String value = Streams.asString(input); 
                        if("name".equals(fileName)){ 
                            this.name = value; 
                        }else if("chunks".equals(fileName)){ 
                            this.chunks = Integer.parseInt(value); 
                        }else if("chunk".equals(fileName)){ 
                            this.chunk = Integer.parseInt(value); 
                        }else if("user".equals(fileName)){ 
                            this.user = value; 
                        }else if("time".equals(fileName)){ 
                            this.time = value; 
                        } 
                    } 
                    // Handle a multi-part MIME encoded file. 
                    else { 
                        String fileDir = req.getSession().getServletContext().getRealPath("/")+FileDir; 
                        File dstFile = new File(fileDir); 
                        if (!dstFile.exists()){ 
                            dstFile.mkdirs(); 
                        } 
                        File dst = new File(dstFile.getPath()+ "/" + this.name); 
                        saveUploadFile(input, dst); 

                    } 

                } 

            } 
            catch (Exception e) { 
                responseString = RESP_ERROR; 
                e.printStackTrace(); 
            } 
        } 
        // Not a multi-part MIME request. 
        else { 
            responseString = RESP_ERROR; 
        } 
        if(this.chunk == this.chunks - 1){ 
            System.out.println("用户:"+this.user); 
            System.out.println("文件名称:"+this.name); 
            System.out.println("上传时间:"+this.time);
        } 

        resp.setContentType(JSON); 
        byte[] responseBytes = responseString.getBytes(); 
        resp.setContentLength(responseBytes.length); 
        ServletOutputStream output = resp.getOutputStream(); 
        output.write(responseBytes); 
        output.flush(); 
    } 

    /** 
     * Saves the given file item (using the given input stream) to the web server's
     * local temp directory. 
     *  
     * @param input The input stream to read the file from 
     * @param dst The dir of upload 
     */ 
    private void saveUploadFile(InputStream input, File dst) throws IOException { 
        OutputStream out = null; 
        try { 
            if (dst.exists()) { 
                out = new BufferedOutputStream(new FileOutputStream(dst, true), 
                        BUF_SIZE); 
            } else { 
                out = new BufferedOutputStream(new FileOutputStream(dst), 
                        BUF_SIZE); 
            } 
            byte[] buffer = new byte[BUF_SIZE]; 
            int len = 0; 
            while ((len = input.read(buffer)) > 0) { 
                out.write(buffer, 0, len); 
            } 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } finally { 
            if (null != input) { 
                try { 
                    input.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 

            if (null != out) { 
                try { 
                    out.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 

        } 

    } 
} 

 

plupload的方法说明

 

var uploadFiles = function( ) {  //定义上传方法
         var uploader = new plupload.Uploader({  //定义上传控件
            runtimes: 'html5,flash,html4',
            browse_button: 'btn_wordView',  //添加文件的标签的ID
            container: 'upload_contain',  //
            url: test.ashx,  //后台cs文件
            flash_swf_url: flash.swf,  //flash文件
            filters : [
                {title : "Image files", extensions : "jpg,gif,png"}  //过滤格式
            ],
            multipart_params: { action: "uploadPhoto" }  //传到后台的参数
        });
        uploader.init(function(up, params) {  //初始化
        });
        $('#start').unbind("click").bind("click",function(e) {  //点击提交按钮事件
            if(uploader.files.length > 0) {
                uploader.start();  //开始上传
                e.preventDefault();
            }
        });
        uploader.bind("FilesAdded", function(up, files) {  

      //添加文件事件绑定

      //up 包涵Uploader的全部信息 
                 //files 包涵这一次添加的所有文件的基本信息          

        });
        uploader.bind("BeforeUpload", function(up, file) {
           //点击上传提交后,上传前的事件

      //up 包涵Uploader的全部信息                  

      //file 准备上传的一个文件的基本信息
        });
        uploader.bind('UploadProgress', function(up, file) {
           //点击上传提交后,上传前的事件完成后,执行正在上传事件

      //up 包涵Uploader的全部信息                  

      //file 正在上传的一个文件的基本信息
        });
        uploader.bind("Error", function(up, err) {
           //当上传失败时,所触发的事件
        });
        uploader.bind("FilesRemoved", function(up, fileArray) {
           //删除已添加的文件所触发的事件
        });
        uploader.bind("FileUploaded", function(up, file, obj) {
           //完成一个文件上传

     //up 包涵Uploader的全部信息                 

     //file 刚刚上传成功的一个文件的基本信息

     //obj 后台cs文件返回的基本信息
        });
        uploader.bind("UploadComplete", function(up, files) {
           //全部文件上传完毕之后所触发的事件

      //up 包涵Uploader的全部信息                

      //files 所上传的全部文件的基本信息


        });
    };
    uploadFiles(option, data);//执行上传的方法。

 

Plupload支持技术:
1:Flash
2:Gears
3:HTML 5
4:Silverlight
5:BrowserPlus
6:HTML 4
plupload主要功能:
1:突破HTTP上传限制,可上传大文件,官方论坛中有讨论上传2G文件的应用。
2:多文件队列上传
3:图片自动生成缩略图
4:上传后自动生成唯一文件名
5:自定制UI

JS参数配置说明:
<script type="text/javascript">   
 $(function() {    
     $("#uploader").pluploadQueue({   
         runtimes : 'gears,flash,silverlight,browserplus,html5',   // 这里是说用什么技术引擎,由于国内浏览器问题这里一般使用flash即可。其他的删除掉。  
         url : 'upload.php',  // 服务端上传路径  
         max_file_size : '10mb',  // 文件上传最大限制。  
         chunk_size : '1mb',  // 上传分块每块的大小,这个值小于服务器最大上传限制的值即可。(文件总大小/chunk_size = 分块数)。  
         unique_names : true,  // 上传的文件名是否唯一  
         resize : {width : 320, height : 240, quality : 90},  // 是否生成缩略图(仅对图片文件有效)。  
         filters : [    
             {title : "Image files", extensions : "jpg,gif,png"},    
             {title : "Zip files", extensions : "zip"}    
         ],  //  这个数组是选择器,就是上传文件时限制的上传文件类型  
         flash_swf_url : '/plupload/js/plupload.flash.swf',  // plupload.flash.swf 的所在路径  
         silverlight_xap_url : '/plupload/js/plupload.silverlight.xap'  // silverlight所在路径 
     });
     // 这一块主要是防止在上传未结束前表带提交,具体大家可酌情修改编写   
     $('form').submit(function(e) {
         var uploader = $('#uploader').pluploadQueue();  // 取得上传队列  
         if (uploader.files.length > 0) {  // 就是说如果上传队列中还有文件  
             uploader.bind('StateChanged', function() {    
                 if (uploader.files.length === (uploader.total.uploaded + uploader.total.failed)) {    
                     $('form')[0].submit();
                 }    
             });    
             uploader.start();    
         } else {    
             alert('You must queue at least one file.');    
         }    
         return false;    
     });   
 });    
 </script>  
由于参数过多大家可以到官方网站查看API参数说明。

分享到:
评论

相关推荐

    plupload+PHP多图片上传

    "plupload+PHP多图片上传" 指的是使用plupload这个JavaScript上传组件结合PHP技术实现的多图片同时上传的功能。plupload是一个强大的文件上传工具,支持多种浏览器和多种上传方式,包括Flash、HTML5、Silverlight等...

    plupload-2.1.2 js、html压缩图片上传图片神器,手机微信网页上传图片必备神器

    Plupload 是一个强大的多浏览器、多模式的文件上传组件,版本2.1.2尤其针对JavaScript和HTML页面的图片上传进行了优化,特别适用于手机微信网页环境。它支持多种浏览器技术,如Flash, Silverlight, Gears, ...

    thinkphp5 多图片上传

    在本文中,我们将深入探讨...通过以上步骤和注意事项,我们可以成功地在ThinkPHP5框架下利用Plupload实现多图片上传、修改和删除功能,提供用户友好的图片管理体验。在实际开发中,可以根据具体需求进行调整和优化。

    plupload 多文件上传组件

    plupload是一款强大的、跨浏览器的多文件上传组件,它支持多种文件上传方式,包括HTML5、Flash、Silverlight和HTML4,确保在不同的浏览器和设备上都能实现稳定可靠的文件上传功能。这个组件旨在解决传统文件上传方式...

    plupload多文件上传组建

    这意味着用户可以在一次操作中选择并上传多个文件,极大地提高了上传效率。此外,它还具备记录上传进度的功能,这对于大文件上传尤其重要,因为用户可以清晰地看到每个文件的上传状态,提升了用户体验。 在技术实现...

    Plupload.Net图片上传示例源码20130830

    Plupload.Net图片上传示例源码 功能介绍: Plupload是一个开源组件!功能的确很强大!它主要功能是多文件上传,并提供图片客户端尺寸压缩。主要的特色是可以使用 Flash Gears ...

    plupload和java后台实现多图上传并把缩略图跟上传的url显示到画面上

    plupload和java后台实现多图上传并把缩略图跟上传的url显示到画面上 1、使用jQuery的plupload实现上传功能,前台无需太多配置,简单修改即可符合您的要求。虽然是jQuery虽然是plupload,但是大多需要手动修改的地方...

    swfupload 和 plupload 图片上传 实时预览

    总的来说,`swfupload`和`plupload`都是为了解决Web上的文件上传问题,特别是图片上传的实时预览需求。两者都提供了丰富的功能和自定义选项,以满足不同项目的需求。随着技术的发展,`plupload`因其对HTML5的充分...

    plupload上传图片

    将`Plupload`与`ThinkPHP`结合,可以实现高效、稳定且用户体验良好的图片上传功能。 首先,我们需要理解`Plupload`的核心特性。它支持断点续传、分块上传,这使得大文件上传变得可能,尤其是在网络不稳定的情况下。...

    plupload-php批量上传图片-jquery

    标题中的"plupload-php批量...整体来看,这个解决方案提供了一个完整的、基于PHP和jQuery的图片批量上传框架,可以帮助开发者快速实现大规模图片上传功能,提升用户体验,并且能够处理网络不稳定情况下的文件上传问题。

    thinkPHP5框架整合plupload实现图片批量上传功能的方法

    本文实例讲述了thinkPHP5框架整合plupload实现图片批量上传功能的方法。分享给大家供大家参考,具体如下: 在官网下载plupload http://http//www.plupload.com 或者点击此处本站下载。 这里我们使用的是plupload...

    plupload文件上传工具

    Plupload的核心特性在于其对多文件上传的支持、分块上传的能力以及实时的上传进度反馈,这使得用户能够更高效、更稳定地上传大量或大体积的文件。 1. **多文件选择与上传**:Plupload允许用户一次性选择多个文件...

    Plupload ASP.NET多图片文件上传JS插件

    Plupload是一款功能强大...总之,Plupload为ASP.NET开发者提供了一种强大的工具,通过其丰富的功能和灵活的配置,可以轻松应对各种文件上传需求,无论是图片、文档还是其他类型的文件,都能实现安全、快捷的上传体验。

    .net plupload文件上传源码

    .NET Plupload 文件上传源码是基于流行的开源多浏览器文件上传组件Plupload的.NET实现。Plupload是一个强大的JavaScript库,它支持各种浏览器,并提供多种功能,如分块上传、进度条显示、多文件选择等。本源码实现了...

    PLupload上传完整例子

    这个“PLupload上传完整例子”是一个实际应用中的案例,旨在展示如何在网页上实现文件上传功能,并且能够传递额外的参数。 在实际的Web开发中,文件上传是一个常见的需求,而PLupload提供了多浏览器兼容性和良好的...

    JS插件plupload.js实现多图上传并显示进度条

    标题中的“JS插件plupload.js实现多图上传并显示进度条”指的是使用JavaScript插件plupload.js来处理用户在网页上选择并上传多张图片的功能,并且在上传过程中显示实时的进度条,以便用户了解文件上传的状态。...

    前端组件 plupload 文件上传demo

    1. **多线程上传**:通过分块上传技术,`plupload` 可以实现文件的多线程上传,提高上传速度。 2. **断点续传**:如果上传过程中出现网络问题,`plupload` 可以保存上传进度,待网络恢复后继续上传,避免了文件的...

    多文件上传JQUERY PLUPLOAD

    在Web开发中,用户经常需要上传多个文件,例如图片、文档等。传统的HTML表单上传方式仅支持单个文件的上传,这在处理大量文件时显得效率低下。为了解决这个问题,开发人员通常会采用JavaScript库来实现多文件上传...

Global site tag (gtag.js) - Google Analytics