Plupload上传组件 + javaweb实现上传源码以及DEMO

  Plupload 是一个Web浏览器上的界面友好的文件上传模块,可显示上传进度、图像自动缩略和上传分块。可同时上传多个文件;

  上网找了很多Plupload的DEMO都无法正常使用, 而且Plupload官方的DEMO是基于PHP, 折腾了半天, 写了一个基于JAVA的DEMO;

  Plupload支持多种方式上传, 包括,flash上传(解决了不同服务器跨域的问题), html5方式上传, html4上传, silverlight的方式上传, Plupload的核心是另外一个JS库:

    MOXIE, MOXIE提供了Plupload的运行环境, 也可以单独拿出来使用, 代码量(体积)挺大的,MOXIE提供了下面几种上传环境:  

      

  Plupload支持分块上传, 支持拖拽上传, 支持图片切块, 支持30多种语言, 而且提供了丰富的API, 因为支持多种方式上传, 可以比较放心的使用这个JS插件;

  容器是tomcat, 需要java的spring框架, 需要apache的几个jar包, commons.fileupload等....;

  以下代码是处理文件上传的java代码:

package controller;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.UUID;

import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSON;

@Controller
public class mainController {

    String uploadPath;
    private static final ResourceBundle    bundle = ResourceBundle.getBundle( "config" );

    @RequestMapping(value="uploadFile.do", method=RequestMethod.POST)
    public void uploadFile( HttpServletRequest request, HttpServletResponse response   ) throws IOException {

        response.setCharacterEncoding( "UTF-8" );
        Integer chunk = null; /* 分割块数 */
        Integer chunks = null; /* 总分割数 */
        String tempFileName = null; /* 临时文件名 */
        String newFileName = null; /* 最后合并后的新文件名 */
        BufferedOutputStream    outputStream    = null;

        /* System.out.println(FileUtils.getTempDirectoryPath()); */
        uploadPath = request.getServletContext().getRealPath( bundle.getString( "uploadPath" ) );
        File up = new File( uploadPath );
        if ( !up.exists() )
        {
            up.mkdir();
        }

        if ( ServletFileUpload.isMultipartContent( request ) )
        {
            try {
                DiskFileItemFactory factory = new DiskFileItemFactory();
                factory.setSizeThreshold( 1024 );
                /* factory.setRepository(new File(repositoryPath));// 设置临时目录 */
                ServletFileUpload upload = new ServletFileUpload( factory );
                upload.setHeaderEncoding( "UTF-8" );
                /* upload.setSizeMax(5 * 1024 * 1024);// 设置附件最大大小,超过这个大小上传会不成功 */
                List<FileItem> items = upload.parseRequest( request );
                for ( FileItem item : items )
                {
                    if ( item.isFormField() ) /* 是文本域 */
                    {
                        if ( item.getFieldName().equals( "name" ) )
                        {
                            tempFileName = item.getString();
                            /* System.out.println("临时文件名:" + tempFileName); */
                        } else if ( item.getFieldName().equals( "chunk" ) )
                        {
                            chunk = Integer.parseInt( item.getString() );
                            /* System.out.println("当前文件块:" + (chunk + 1)); */
                        } else if ( item.getFieldName().equals( "chunks" ) )
                        {
                            chunks = Integer.parseInt( item.getString() );
                            /* System.out.println("文件总分块:" + chunks); */
                        }
                    } else { /* 如果是文件类型 */
                        if ( tempFileName != null )
                        {
                            String chunkName = tempFileName;
                            if ( chunk != null )
                            {
                                chunkName = chunk + "_" + tempFileName;
                            }
                            File savedFile = new File( uploadPath, chunkName );
                            item.write( savedFile );
                        }
                    }
                }

                newFileName = UUID.randomUUID().toString().replace( "-", "" )
                          .concat( "." )
                          .concat( FilenameUtils.getExtension( tempFileName ) );
                if ( chunk != null && chunk + 1 == chunks )
                {
                    outputStream = new BufferedOutputStream(
                        new FileOutputStream( new File( uploadPath, newFileName ) ) );
                    /* 遍历文件合并 */
                    for ( int i = 0; i < chunks; i++ )
                    {
                        File tempFile = new File( uploadPath, i + "_" + tempFileName );
                        byte[] bytes = FileUtils.readFileToByteArray( tempFile );
                        outputStream.write( bytes );
                        outputStream.flush();
                        tempFile.delete();
                    }
                    outputStream.flush();
                }
                Map<String, Object> m = new HashMap<String, Object>();
                m.put( "status", true );
                m.put( "fileUrl", bundle.getString( "uploadPath" ) + "/"
                       + newFileName );
                response.getWriter().write( JSON.toJSONString( m ) );
            } catch ( FileUploadException e ) {
                e.printStackTrace();
                Map<String, Object> m = new HashMap<String, Object>();
                m.put( "status", false );
                response.getWriter().write( JSON.toJSONString( m ) );
            } catch ( Exception e ) {
                e.printStackTrace();
                Map<String, Object> m = new HashMap<String, Object>();
                m.put( "status", false );
                response.getWriter().write( JSON.toJSONString( m ) );
            } finally {
                try {
                    if ( outputStream != null )
                        outputStream.close();
                } catch ( IOException e ) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void main() {

    }

}

  

  前端界面的主要代码:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>plupload示例</title>
<script src="http://cdn.bootcss.com/jquery/1.9.0/jquery.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/plupload.full.min.js"></script>

</head>
<body>
    <div id="filelist">

    </div>
    <button id="uploader">选择文件</button>
    <div id="progress"></div>
    <div id="result"></div>
</body>
<script type="text/javascript">
        var uploader = new plupload.Uploader({
            runtimes : ‘html5,flash,silverlight‘,//设置运行环境,会按设置的顺序,可以选择的值有html5,gears,flash,silverlight,browserplus,html
            flash_swf_url : ‘./js/Moxie.swf‘,
            silverlight_xap_url : ‘./js/Moxie.xap‘,
            url : ‘${pageContext.request.contextPath}/uploadFile.do‘,//上传文件路径
            max_file_size : ‘3gb‘,//100b, 10kb, 10mb, 1gb
            chunk_size : ‘1mb‘,//分块大小,小于这个大小的不分块
            unique_names : true,//生成唯一文件名
            browse_button : ‘uploader‘,
            filters : [ {
                title : ‘Image files‘,
                extensions : ‘jpg,gif,png‘
            }, {
                title : ‘Zip files‘,
                extensions : ‘zip,7z,rar‘
            } ],

            init : {
                FilesAdded: function(up, files) {

                    uploader.start();
                    return false;
                },
                FileUploaded : function(up, file, info) {//文件上传完毕触发
                    console.log("单独文件上传完毕");
                    var response = $.parseJSON(info.response);
                    if (response.status) {
                        $(‘#result‘).append( $(‘<div> "文件路径是:"‘ + response.fileUrl + ‘"随机的文件名字为:"‘ + file.name + ‘</div>‘) );
                    }
                },
                UploadComplete : function( uploader,files ) {
                    console.log("所有文件上传完毕");
                },
                UploadProgress : function( uploader,file ) {
                    $("#progress").html("上传进度为:" + file.percent + "%");
                    console.log( file.percent );
                }
            }
        });

        uploader.init();
</script>
</html>

  

  整体界面如下:

  

  整体代码放在baidu云盘: 打开下载

  github项目

  plupload中文文档

  百度网盘链接

时间: 2024-12-15 01:40:09

Plupload上传组件 + javaweb实现上传源码以及DEMO的相关文章

GitHub 上值得参考的完整的 iOS-App 源码

http://www.cnblogs.com/feiyu-mdm/p/5603585.html GitHub 上值得参考的完整的 iOS-App 源码

Spark2.0从入门到精通:Scala编程、大数据开发、上百个实战案例、内核源码深度剖析视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

.Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码]

原文:.Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码] 经过两天的学习,把常用的组件都学习了一遍,并做成了App 学习可能真没有捷径,跟学习html有点类似,都是一个控件一个控件学习并使用,最后拼凑成一个系统 链接:http://pan.baidu.com/s/1hqefzEW 密码:zbel  最低API 2.3 目标API 4.4 采用Android Studio 0.58IDE 希望给和我同样的初学者带来一些便利,和开发时候可以查询,第一个版本可能比较

在centos7上安装gcc、node.js(源码下载)

一.在centos7中安装node.js https://www.cnblogs.com/lpbottle/p/7733397.html 1.从源码下载Nodejs cd /usr/local/srcwget https://npm.taobao.org/mirrors/node/v8.7.0/node-v8.7.0.tar.gz 2.解压缩 nodejs 安装包 tar xvf node-v8.7.0.tar.gz 3.进入解压的node文件夹,安装必要的编译软件包 cd node-v8.7.

android四大组件之Activity - (1)从源码中理解并巧用onWindowFocusChanged(boolean hasFocus)

这里开始到后面,想趁着有时间,将Android四大组件和一些系统组件做一些总结和记录.由于网上已经有很多写的很好并且总结也全面的文章.小弟我也囊中羞涩不敢献丑,就记录一些自己觉得重要的有用的知识点,顺便大家一起学习讨论啥的也好 Activity作为四大组件之一,对于整个Android开发有多重要就无需赘言了.关于它的生命周期,这里借用下官网的图,便一目了然: 那么它的生命周期和我们所说的onWindowFocusChanged(boolean hasFocus)方法有何关系? Activity生

百度开源上传组件webuploader 可上传多文件并带有进度条

//上传多文件 function UploadMultiFile() { var uploader = WebUploader.create({ // 选完文件后,是否自动上传. auto: true, // swf文件路径 swf: '~/Content/libs/webuploader/Uploader.swf', // 文件接收服务端. server: '../../Document/Art/UploadFile', // 选择文件的按钮.可选. // 内部根据当前运行是创建,可能是inp

php文件上传原理详解(含源码)

1.文件上传原理 将客户端的文件上传到服务器,再将服务器的临时文件上传到指定目录 2.客户端配置 提交表单 表单的发送方式为post 添加enctype="multipart/form-data" 3.服务器端配置 file_uploads = On,支持HTTP上传 uoload_tmp_dir = ,临时文件保存目录 upload_max_filesize = 2M,允许上传文件的最大值 max_file_uploads = 20 ,允许一次上传到的最大文件数 post_max_s

在Windows 系统上构建从github获得的jquery源码

从github上下载的jquery文件是没有经过压缩和合并的,根据jquery  README.md 中提供的说明在window构建jquery,进行到最后一步运行grunt时会直接编辑器中打开grunt.js,不能够完成构建,需要先在命令行执行:DOSKEY grunt=grunt.cmd $*.下面详细的构建步骤: 0 安装github,下载地址: http://windows.github.com/ 1 安装 NodeJS,下载地址:http://nodejs.org/#download

Scala实战高手****第14课Scala集合上的函数式编程实战及Spark源码鉴赏

package com.dt.spark.scala.bascis object Functional_Itearal {   def main(args: Array[String]): Unit = {        val range = 1 to 10     val list = List(1,2,3,4,5)     println(list.head)      println(list.tail)            println(list.tail)         pri