WebUploader插件上传大文件单文件和多文件JAVA版使用总结

一.使用webuploader插件的原因说明

被现在做的项目坑了。

先说一下我的项目架构Spring+struts2+mybatis+mysql

然后呢。之前说好的按照2G上传就可以了,于是乎,用了ajaxFileUpload插件,因为之前用图片上传也是用这个,所以上传附件的时候就直接拿来用了

各种码代码,测试也测过了,2G文件上传没问题,坑来了,项目上线后,客户又要求上传4G文件,甚至还有20G以上的。。纳尼,你不早说哦。。。

在IE11下用ajaxFileUpload.js插件上传超过4G的文件,IE直接抛出异常了。弹出 算术结果超过32位 的消息.

如下图:

附加说明一下,我的系统是64位,8G内存,google浏览器和IE11浏览器都是32位的。google下用AjaxFileUpload上传8G都问题。都不会报错。

IE11下超过4G直接报上图这个错了。没办法。换插件。

二.插件选择

1.stream上传插件。stream是解决不同浏览器上传文件插件,是Uploadify的flash版和html5的结合。插件地址http://www.twinkling.cn/

功能确实很强大,不过CSS样式固定死了,和我现在项目的进度条样式很不一样。还是放弃了这个插件

2.Webuploader 插件。WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+。两套运行时,同样的调用方式,可供用户任意选用。

采用大文件分片并发上传,极大的提高了文件上传效率。插件地址 http://fex.baidu.com/webuploader/

这个插件可以自定义CSS样式啊。功能也很强大,于是乎果断采用这个插件。

三.WebUploader 单文件上传

我用的是Webuploader0.1.5版本的,Webuploader主要是把大文件在客户端进行分片,比如按照每5M进行分片发送请求,后台接收到文件进行合并文件。两种方式合并文件,第一种等所有分片都传到后台,然后在合并,这种要保障分片顺序正确,第二种是边分片边合并。项目里我使用的是第二种。使用Web Uploader文件上传需要引入三种资源:JS, CSS, SWF。

1.引入JS文件

<script type="text/javascript" src="../main/js/webuploader.js"></script>
<script type="text/javascript" src="../main/js/webuploader.min.js"></script>

2.引入CSS样式

<link href="../main/css/webuploader.css" rel="stylesheet" type="text/css" />

3.引入SWF,SWF不直接引用,在webUploader初始化的时候指定SWF的路径就可以了。

4.upload3.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<meta http-equiv="Content-Language"  content="ja" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title>DEMO</title>
<link href="../main/css/stream-v1.css" rel="stylesheet" type="text/css" />
<link href="../main/css/webuploader.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="../main/js/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="../main/js/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="../main/js/jquery-ui.min.js"></script>
<script type="text/javascript" src="../main/js/bootstrap-datepicker.min.js"></script>
<script type="text/javascript" src="../main/js/locales/bootstrap-datepicker.ja.min.js"></script>
<script type="text/javascript" src="../main/js/webuploader.js"></script>
<script type="text/javascript" src="../main/js/webuploader.min.js"></script>
<script type="text/javascript" src="../js/contents/upload3.js"></script>
</head>
<body>
<div id="uploader" class="wu-example">
    <!--用来存放文件信息-->
    <div id="thelist" class="uploader-list"></div>
    <div class="btns">
        <div id="attach"></div>
        <input type="button" value="上传" id="upload"/>
    </div>
</div>

<div id="uploader1" class="wu-example">
    <!--用来存放文件信息-->
    <div id="thelist1" class="uploader-list"></div>
    <div class="btns">
        <div id="multi"></div>
        <input type="button" value="上传" id="multiUpload"/>
    </div>
</div>

</body>
</html>

画面比较简单,长这个样子

5.upload3.js

包含单文件上传,多文件上传,和webuploader多实例

/*********************************WebUpload 单文件上传 begin*****************************************/
$(function(){
    var $list = $("#thelist");
    var  uploader ;// 实例化
    uploader = WebUploader.create({
           auto:false, //是否自动上传
            pick: {
                id: ‘#attach‘,
                name:"file",  //这个地方 name 没什么用,虽然打开调试器,input的名字确实改过来了。但是提交到后台取不到文件。如果想自定义file的name属性,还是要和fileVal 配合使用。
                label: ‘点击选择图片‘,
                multiple:false            //默认为true,就是可以多选
            },
            swf: ‘../../main/js/Uploader.swf‘,
            //fileVal:‘multiFile‘,  //自定义file的name属性,我用的版本是0.1.5 ,打开客户端调试器发现生成的input 的name 没改过来。
                                             //名字还是默认的file,但不是没用哦。虽然客户端名字没改变,但是提交到到后台,是要用multiFile 这个对象来取文件的,用file 是取不到文件的
                                             // 建议作者有时间把这个地方改改啊,搞死人了。。
            server: "ContentsDetail!ajaxAttachUpload.action",
            duplicate:true,//是否可重复选择同一文件
            resize: false,
            formData: {
                "status":"file",
                "contentsDto.contentsId":"0000004730",
                "uploadNum":"0000004730",
                "existFlg":‘false‘
            },
            compress: null,//图片不压缩
            chunked: true,  //分片处理
            chunkSize: 5 * 1024 * 1024, //每片5M
            chunkRetry:false,//如果失败,则不重试
            threads:1,//上传并发数。允许同时最大上传进程数。
            // runtimeOrder: ‘flash‘,
            // 禁掉全局的拖拽功能。这样不会出现图片拖进页面的时候,把图片打开。
            disableGlobalDnd: true
        });  

        // 当有文件添加进来的时候
       uploader.on( "fileQueued", function( file ) {
           console.log("fileQueued:");
           $list.append( "<div id=‘"+  file.id + "‘ class=‘item‘>" +
               "<h4 class=‘info‘>" + file.name + "</h4>" +
               "<p class=‘state‘>等待上传...</p>" +
           "</div>" );
       });

       //当所有文件上传结束时触发
       uploader.on("uploadFinished",function(){
           console.log("uploadFinished:");
       })

        //当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。
        uploader.on("uploadAccept",function(object,ret){
            //服务器响应了
            //ret._raw  类似于 data
            var data =JSON.parse(ret._raw);
            if(data.resultCode != "1" && data.resultCode != "3"){
                if(data.resultCode == "9"){
                    uploader.reset();
                    alert("error");
                    return false;
                }
            }else{
                //E05017
                uploader.reset();
                alert("error");
                return false;
            }
           })

       //当文件上传成功时触发。
         uploader.on( "uploadSuccess", function( file ) {
           $( "#"+file.id ).find("p.state").text("已上传");
       });

       uploader.on( "uploadError", function( file ) {
           $( "#"+file.id ).find("p.state").text("上传出错");
           uploader.cancelFile(file);
           uploader.removeFile(file,true);
           uploader.reset();
       });

       $("#upload").on("click", function() {
           uploader.upload();
       })

});
/*********************************WebUpload 单文件上传 end*******************************************/

/*********************************WebUpload 多文件上传 begin*****************************************/
$(function(){
    var $list = $("#thelist1");
    var fileSize = 0;  //总文件大小
    var fileName = []; //文件名列表
    var fileSizeOneByOne =[];//每个文件大小
    var  uploader ;// 实例化
    uploader = WebUploader.create({
            auto:false, //是否自动上传
            pick: {
                id: ‘#multi‘,
                label: ‘点击选择文件‘,
                name:"multiFile"
            },
            swf: ‘../../main/js/Uploader.swf‘,
            server: "ContentsDetail!multiUpload.action",
            duplicate:true, //同一文件是否可重复选择
            resize: false,
            formData: {
                "status":"multi",
                "contentsDto.contentsId":"0000004730",
                "uploadNum":"0000004730",
                "existFlg":‘false‘
            },
            compress: null,//图片不压缩
            chunked: true,  //分片
            chunkSize: 5 * 1024 * 1024,   //每片5M
            chunkRetry:false,//如果失败,则不重试
            threads:1,//上传并发数。允许同时最大上传进程数。
            //fileNumLimit:50,//验证文件总数量, 超出则不允许加入队列
            // runtimeOrder: ‘flash‘,
            // 禁掉全局的拖拽功能。这样不会出现图片拖进页面的时候,把图片打开。
            disableGlobalDnd: true
        });  

       // 当有文件添加进来的时候
       uploader.on( "fileQueued", function( file ) {
           console.log("fileQueued:");
           $list.append( "<div id=‘"+  file.id + "‘ class=‘item‘>" +
               "<h4 class=‘info‘>" + file.name + "</h4>" +
               "<p class=‘state‘>等待上传...</p>" +
           "</div>" );
       });

       // 当开始上传流程时触发
       uploader.on( "startUpload", function() {
           console.log("startUpload");
           //添加额外的表单参数
           $.extend( true, uploader.options.formData, {"fileSize":fileSize,"multiFileName":fileName.join(","),"fileSizeOneByOne":fileSizeOneByOne.join(",")});
       });

       //当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。
       uploader.on("uploadAccept",function(object,ret){
            //服务器响应了
            //ret._raw  类似于 data
            console.log("uploadAccept");
            console.log(ret);
            var data =JSON.parse(ret._raw);
            if(data.resultCode!="1" && data.resultCode !="3"){
                if(data.resultCode == "9"){
                    alert("error");
                    uploader.reset();
                    return;
                }
            }else{
                uploader.reset();
                alert("error");
            }
        })

       uploader.on( "uploadSuccess", function( file ) {
           $( "#"+file.id ).find("p.state").text("已上传");
       });

       uploader.on( "uploadError", function( file,reason  ) {
           $( "#"+file.id ).find("p.state").text("上传出错");
           console.log("uploadError");
           console.log(file);
           console.log(reason);
           //多个文件
           var fileArray = uploader.getFiles();
           for(var i = 0 ;i<fileArray.length;i++){
               uploader.cancelFile(fileArray[i]);
               uploader.removeFile(fileArray[i],true);
            }
           uploader.reset();
           fileSize = 0;
           fileName = [];
           fileSizeOneByOne=[];
       });

     //当validate不通过时,会以派送错误事件的形式通知调用者
       uploader.on("error",function(){
           console.log("error");
           uploader.reset();
           fileSize = 0;
           fileName = [];
           fileSizeOneByOne=[];
           alert("error");
       })

       //如果是在模态框里的上传按钮,点击file的时候不会触发控件
       //修复model内部点击不会触发选择文件的BUG
       /*     $("#multi .webuploader-pick").click(function () {
                uploader.reset();
                fileSize = 0;
                fileName = [];
                fileSizeOneByOne=[];
                $("#multi :file").click();//关键代码
            });*/

            //选择文件之后执行上传
            $(document).on("change","input[name=‘multiFile‘]", function() {
                   var fileArray1 = uploader.getFiles();
                   for(var i = 0 ;i<fileArray1.length;i++){
                       //后台用
                       fileSize +=fileArray1[i].size;
                       fileSizeOneByOne.push(fileArray1[i].size);
                       fileName.push(fileArray1[i].name);
                    }
                   console.log(fileSize);
                   console.log(fileSizeOneByOne);
                   console.log(fileName);
            })

          /**
         * 多文件上传
         */
        $("input[name=‘multiUpload‘]").on("click",function(){
            uploader.upload();
        })
});
/*********************************WebUpload 多文件上传 end*****************************************/

/************************************webuploader的自带参数提交到后台的参数列表*************************
 * {

//web uploader 的自带参数
lastModifiedDate=[Wed Apr 27 2016 16:45:01 GMT+0800 (中国标准时间)],
chunks=[3], chunk=[0],
type=[audio/wav], uid=[yangl],  id=[WU_FILE_0],
size=[268620636], name=[3.wav],

//formData的参数
contentsDto.contentsId=[0000004730], existFlg=[false],
status=[file], uploadNum=[0000004730]
}
*********************************************************************************************/

6.ContentsDetail.action

//单文件上传后台代码
public void ajaxAttachUpload() {
        String path =  "d:\\test\\"+fileFileName;
        try {
            File file = this.getFile();
            FileUtil.randomAccessFile(path, file);
            //如果文件小与5M的话,分片参数chunk的值是null
            if(StringUtils.isEmpty(chunk)){
                outJson("0", "success", "");
            }else{
            //chunk 分片索引,下标从0开始
            //chunks 总分片数
                if (Integer.valueOf(chunk) == (Integer.valueOf(chunks) - 1)) {
                    outJson("0", "上传成功", "");
                } else {
                    outJson("2", "上传中" + fileFileName + " chunk:" + chunk, "");
                }
            }
        } catch (Exception e) {
            outJson("3", "上传失败", "");
        }
    }

FileUtil.java

/**
     * 指定位置开始写入文件
     * @param tempFile  输入文件
     * @param outPath  输出文件的路径(路径+文件名)
     * @throws IOException
     */
    public static void randomAccessFile( String outPath,File tempFile) throws IOException{
        RandomAccessFile  raFile = null;
        BufferedInputStream inputStream=null;
        try{
            File dirFile = new File(outPath);
            //以读写的方式打开目标文件
            raFile = new RandomAccessFile(dirFile, "rw");
            raFile.seek(raFile.length());
            inputStream = new BufferedInputStream(new FileInputStream(tempFile));
            byte[] buf = new byte[1024];
            int length = 0;
            while ((length = inputStream.read(buf)) != -1) {
                raFile.write(buf, 0, length);
            }
        }catch(Exception e){
            throw new IOException(e.getMessage());
        }finally{
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (raFile != null) {
                    raFile.close();
                }
            }catch(Exception e){
                throw new IOException(e.getMessage());
            }
        }
    }

7.效果图

为啥不能传附件,只能添加图片,先暂时写到这里。有时间在把多文件上传的后台整理一下再更新。

时间: 2024-10-01 02:48:54

WebUploader插件上传大文件单文件和多文件JAVA版使用总结的相关文章

用百度webuploader分片上传大文件

一般在做文件上传的时候,都是通过客户端把要上传的文件上传到服务器,此时上传的文件都在服务器内存,如果上传的是视频等大文件,那么服务器内存就很紧张,而且一般我们都是用flash或者html5做异步上传,如果文件比较大的话,即便是客户端显示文件已经上传了100%,还是会有一个比较长时间的等待,而且当前页面对服务器的请求也会被阻塞. 正常情况下,一般都是在长传完成后,在服务器直接保存. 1 public void ProcessRequest(HttpContext context) 2 { 3 co

百度Fex webuploader.js上传大文件失败

项目上用百度webuploader.js上传文件,option选项里面已经设置单个文件大小,但是上传低于此阈值的文件时仍然不成功. 我现在的理解是,框架是将文件post到后台服务器端的.. 百度发现是IIS里面对大文件有限制.. <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules runAllManagedModulesForAllRe

uploadify上传大文件

引言 之前使用Uploadify做了一个上传图片并预览的功能,今天在项目中,要使用该插件上传大文件.之前弄过上传图片的demo,就使用该demo进行测试.可以查看我的这篇文章: [Asp.net]Uploadify所有配置说明,常见bug问题分析 . 大文件上传 第一步:修改uploadify参数 1 'fileSizeLimit': '0',//单个文件大小,0为无限制,可接受KB,MB,GB等单位的字符串值 2 'fileTypeDesc': '文件',//文件描述Image Files 3

PHP上传大文件的三种解决方案

前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长,请求超时:3,传输中断,必须重新上传导致前功尽弃: 解决方案: 1,修改服务端上传的限制配置:Nginx 以及 PHP 的上传文件限制 不宜过大,一般5M 左右为好: 2,大文件分片,一片一片的传到服务端,再由服务端合并.这么做的好处在于一旦上传失败只是损失一个分片而已,不用整个文件重传,而且每个分

运用php上传大文件配置方法

网站建设:运用php上传大文件配置方法如下: 翻开php.ini, 1.第一找出 file uploads区域,有影响文件上传的以下几个参数: file_uploads = on ;能否准许经过http上传文件的开关.默许为on即是开 upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,假设没指定就会用系统默许的临时文件夹 upload_max_filesize = 8m ;望文生意,即准许上传文件大小的最大值.默许为2m 2.在resource limits区域,还有参数 ;

PHP上传遇到的问题-php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项

今天在做上传的时候出现一个非常怪的问题,有时候表单提交可以获取到值,有时候就获取不到了,连普通的字段都获取不到了,苦思冥想还没解决,最后问了师傅,师傅看了说挺奇怪的,然后问我upload_max_filesize的值改了吗,我说改了啊,师傅也解决不了了.过了一会师傅问post_max_size改了吗,我说那个和上传没关系吧,师傅没理我,我还是照着自己的想法继续测试,弄了半天还是不行,最后试了师傅提的意见,成功了,原来上传是和post_max_size有关系的. 总结:php.ini配置文件中的默

php 上传大文件主要涉及配置upload_max_filesize和post_max_size两个选项

php 上传大文件主要涉及配置 upload_max_filesize 和post_max_size两个选项 今天在做上传的时候出现一个非常怪的问题,有时候表单提交可以获取到值,有时候就获取不到了,连普通的字段都获取不到了,苦思冥想还没解决,最后问了师傅, 师傅看了说挺奇怪的,然后问我 upload_max_filesize的值改了吗,我说改了啊,师傅也解决不了了.过了一会师傅问 post_max_size改了吗,我说那个和上传没关系吧, 师傅没理我,我还是照着自己的想法继续测试,弄了半天还是不

php上传大文件失败处理

下面分别是各种原因以及解决办法:第1种情况:文件上传时存放文件的临时目录必须是开启的并且是 PHP 进程所有者用户可写的目录.如果未指定则 PHP 使用系统默认值.php.ini文件中upload_tmp_dir用来说明PHP上传的文件放置的临时目录,要想上传文件,得保证服务器没有关闭临时文件并对该文件夹有写入的权限. 第2种情况:max_execution_time 的值必须足够大.变量 max_execution_time 设置了在强制终止脚本前PHP等待脚本执行完毕的时间,此时间以秒计算.

PHP+IIS上传大文件

最近刚接触IIS服务器,在使用php上传大文件的时候,遇到了一些问题.通过查阅网上资料进行了总结,希望对各位有帮助. 第一步,检查PHP的配置. 打开php.ini配置文件 1.file_uploads 设为On,允许通过HTTP上传文件 2.upload_tmp_dir 文件上传至服务器时用于临时存储的目录,如果没指定,系统会使用默认的临时文件夹(我的机器是/tmp). 3.upload_max_filesize 允许上传文件大小的最大值,默认为2M. 4.post_max_size Php可