webuploader 大文件分片上传

参考:http://fex.baidu.com/webuploader/

使用:

前端页面:

	  
选择文件
文件名称 大小 进度 状态 操作
开始上传

后端-springmvc

    @SuppressWarnings({"rawtypes", "unchecked"})
    @NeedLogin
    @RequestMapping("/uploadBigFileAdd")
    public @ResponseBody String uploadBigFileAdd(MultipartFile file, String guid, Integer chunk, Integer chunks,
        HttpServletRequest request) {

        String fileSavePath = "";
        try {
            fileSavePath = URLDecoder.decode(URLDecoder.decode(request.getParameter("path"), "UTF-8"), "UTF-8");
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        String tmpPath = "";
        String fileName = file.getOriginalFilename();
        UploadFileLog log = new UploadFileLog();
       
        log.setFileName(fileName);
        if (chunk == null && chunks == null) {// 没有分片 直接保存
            long stime = System.currentTimeMillis();
            fileSavePath =
                fileSavePath + File.separatorChar + DateUtils.formatDate(new Date(), DateUtils.FILE_NAME_PATTERN);
            File uploadFile = new File(fileSavePath + File.separatorChar + fileName);
            try {
                FileUtils.copyInputStreamToFile(file.getInputStream(), uploadFile);
            } catch (IOException e) {
                logger.error("IOException 0", e);
            }
            // 保存日志
            log.setPath(uploadFile.getAbsolutePath());
            log.setTimes(System.currentTimeMillis() - stime);
            logService.addLog(log);
            return "";
        } else {
            tmpPath = fileSavePath + File.separatorChar + "tmp" + File.separatorChar
                + DateUtils.formatDate(new Date(), DateUtils.FILE_NAME_PATTERN);
            if (chunk == 0) {
                start.set(System.currentTimeMillis());
            }
            // 根据guid 创建一个临时的文件夹
            File file2 = new File(tmpPath + File.separatorChar + guid + File.separatorChar + chunk);
            if (!file2.exists()) {
                file2.mkdirs();
            }
            try {
                // 保存每一个分片
                file.transferTo(file2);
            } catch (Exception e) {
                logger.error("transferTo Exception ", e);
            }
            // 如果当前是最后一个分片,则合并所有文件
            if (chunk == (chunks - 1)) {
                //先对分片排序,然后合并文件
            }

        }

        return "";
    }

 

测试结果:

每片5M

文件大小 上传耗时 合并文件耗时 分片数
136M 1171ms 556ms 28
254M 2109ms 1660ms 51
1.75G 31488ms 26462ms 359

 

每片10M

文件大小 上传耗时 合并文件耗时 分片数
136M 404ms 295ms  14
254M 2401ms 1015ms 26
1.75G 28452ms 22866ms 180

 

每片15M

文件大小 上传耗时 合并文件耗时 分片数
136M 749ms 515ms 10
254M 1857ms 1126ms 17
1.75G 26189ms 22866ms 120

你可能感兴趣的:(日常问题)