(三)springMVC WebUploader分片上传

环境:windows 7
网络:本机或局域网
架构:基于maven的j2ee springMVC
测试结果:可上传620MB左右的文件,如果更大的文件 —> 提示“目标文件”被占用
结论:java拥有跨平台特性,在Api方面不注重方便高效,更多侧重于兼容,对文件无法做到及时有效关闭。
目标:多线程、分片上传,目前无时间安排

1、springMvc 的 servlet加入以下代码(允许上传):

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

2、前端代码片段

引入webuploader css文件,jquery.js文件 webuploader.js 文件,本示例为springMVC,片段代码:

<div id="thelist" class="uploader-list"></div>
                                <div style="margin:20px 20px 20px 0;">
                                    <div id="picker" class="form-control-focus">选择文件</div>
                                </div>
                                <button id="btnSync" type="button" class="btn btn-warning">开始同步</button>
<!-- 省略上面代码 -->
<script>
var uploader = WebUploader.create({

            // swf文件路径
            swf : _ctxRes
                    + '/assets/global/plugins/webuploader-0.1.5/Uploader.swf',

            // 文件接收服务端。
            server : _ctx + '/test-sync/sync',

            chunked : true,

            threads : 1,

            fromData : {
                guid : 'guid'
            },

            // 选择文件的按钮。可选。
            // 内部根据当前运行是创建,可能是input元素,也可能是flash.
            pick : '#picker',

            // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
            resize : false
        });

        // 当有文件被添加进队列的时候
        uploader.on('fileQueued', function(file) {
            //alert(123);
            $("#thelist").append(
                    '<div id="' + file.id + '" class="item">'
                            + '<h4 class="info">' + file.name + '</h4>'
                            + '<p class="state">等待上传...</p>' + '</div>');
        });

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

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

        uploader.on('uploadComplete', function(file) {
            $('#' + file.id).find('.progress').fadeOut();
        });

        $("#btnSync").on('click', function() {
            if ($(this).hasClass('disabled')) {
                return false;
            }
            uploader.options.formData.guid = Math.random();
            uploader.upload();

        });
    </script> </body>

3、服务器端代码

/**
     * 单个文件同步接口
     * 
     * @param request
     * @return
     * @throws JsonGenerationException
     * @throws JsonMappingException
     * @throws IOException
     */
    @SuppressWarnings("resource")
    @RequestMapping(value = "/test-sync/sync", produces = "text/plain;charset=UTF-8")
    @ResponseBody
    public String sync(
            @RequestParam(value = "file", required = false) MultipartFile file,
            HttpServletRequest request, HttpServletResponse response)
            throws JsonGenerationException, JsonMappingException, IOException {


        if (request.getParameter("chunk") == null) {

            String realPath = request.getSession().getServletContext()
                    .getRealPath("/Upload/");
            String fileName = file.getOriginalFilename();

            File targetFile = new File(realPath, fileName);
            if (!targetFile.exists()) {
                targetFile.mkdirs();
            }
            file.transferTo(targetFile); // 小文件,直接拷贝

            return "";
        } else {
            int chunk = Integer.parseInt(request.getParameter("chunk")); // 当前分片
            int chunks = Integer.parseInt(request.getParameter("chunks")); // 分片总计

            String realPath = request.getSession().getServletContext()
                    .getRealPath("/Upload/");

            String Ogfilename = file.getOriginalFilename();

            File tempFile = new File(realPath, Ogfilename);
            OutputStream outputStream = new FileOutputStream(tempFile, true);
            InputStream inputStream = file.getInputStream();

            byte buffer[] = new byte[1024];
            int len = 0;
            while ((len = inputStream.read(buffer)) > 0) {
                outputStream.write(buffer, 0, len);
            }
            inputStream.close();
            outputStream.close();

            return "";
        }

    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值