webuploader大文件 分片 断点续传

原文参考于http://blog.csdn.net/chenxiaoyu_csdn/article/details/70847203
其中修复了原文章中由于网络中断等问题,断点续传时会再次上传已经上传文件的问题.修复了不需要分片的文件,上传过程中会出现异常的问题.

  1. webupload官网下载需要的Uploader.swf、webuploader.css、webuploader.js  文件
  2. jsp 页面
                         
选择文件

3.js 代码
  

4. 后台文件上传及合并代码

	// 上传文件
	@RequestMapping(value = "upload")
	public void uploadFile(HttpServletRequest request,
			HttpServletResponse response, String projectName)
			throws IOException {
		response.setCharacterEncoding("UTF-8");
		Map map = new HashMap<>();
		MultipartFile uploadFile = ((MultipartHttpServletRequest) request)
				.getFile("file");
		String fileMd5 = request.getParameter("fileMd5");
		String chunk = request.getParameter("chunk");
		String path = audioPath;
		File file = new File(path + fileMd5);
		if (!file.exists()) {
			file.mkdirs();// 创建文件夹
		}
		// 保存文件
		File chunkFile = new File(path + fileMd5 + "/" + chunk);
		if (!chunkFile.exists()) {
			chunkFile.createNewFile();
		}
		uploadFile.transferTo(chunkFile);
	}

	// 合并或验证分片文件是否需要上传
	@RequestMapping(value = "checkOrMerge")
	public void checkOrMerge(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		response.setCharacterEncoding("UTF-8");
		String savePath = audioPath;

		String action = request.getParameter("action");

		if (action.equals("mergeChunks")) {
			// 合并文件
			// 需要合并的文件的目录标记
			// 文件MD5
			String fileMd5 = request.getParameter("fileMd5");
			// 文件名称
			String fileName = request.getParameter("fileName");
			// 文件扩展名
			String suffixName = request.getParameter("ext");
			// 项目名称
			String projectName = request.getParameter("projectName");
			System.out.println("fileMd5  :" + fileMd5);
			System.out.println("fileName  :" + fileName);
			System.out.println("projectName  :" + projectName);
			// 读取目录里的所有文件
			File f = new File(savePath + fileMd5);
			File[] fileArray = f.listFiles(new FileFilter() {
				// 排除目录只要文件
				@Override
				public boolean accept(File pathname) {
					if (pathname.isDirectory()) {
						return false;
					}
					return true;
				}
			});
			System.out.println(" fileArray " + fileArray);
			// 转成集合,便于排序
			List fileList = new ArrayList(Arrays.asList(fileArray));
			// 需要合并的文件才进行排序,即分片的大小大于1
			if (fileList != null && fileList.size() > 1) {
				Collections.sort(fileList, new Comparator() {
					@Override
					public int compare(File o1, File o2) {
						// TODO Auto-generated method stub
						if (Integer.parseInt(o1.getName()) < Integer
								.parseInt(o2.getName())) {
							return -1;
						}
						return 1;
					}
				});
			}
			// 合并的文件夹
			File mergeFile = new File(savePath + projectName);
			if (!mergeFile.exists()) {
				mergeFile.mkdirs();
			}
			// UUID.randomUUID().toString()-->随机名
			File outputFile = new File(savePath + projectName + "/" + fileName);
			// 创建文件
			outputFile.createNewFile();
			// 输出流
			FileChannel outChnnel = new FileOutputStream(outputFile)
					.getChannel();
			// 合并
			FileChannel inChannel;
			for (File file : fileList) {
				inChannel = new FileInputStream(file).getChannel();
				inChannel.transferTo(0, inChannel.size(), outChnnel);
				inChannel.close();
				// 删除分片
				file.delete();
			}
			outChnnel.close();
			// 清除文件夹
			File tempFile = new File(savePath + fileMd5);
			if (tempFile.isDirectory() && tempFile.exists()) {
				tempFile.delete();
			}
			System.out.println("合并成功");
			Map map = new HashMap<>();
			// 文件路径
			map.put("path", projectName + "/" + fileName);
			response.getWriter().print(JSON.toJSON(map));
		} else if (action.equals("checkChunk")) {
			// 检查当前分块是否上传成功
			String fileMd5 = request.getParameter("fileMd5");
			String chunk = request.getParameter("chunk");
			String chunkSize = request.getParameter("chunkSize");

			File checkFile = new File(savePath + fileMd5 + "/" + chunk);

			response.setContentType("text/html;charset=utf-8");
			// 检查文件是否存在,且大小是否一致
			if (checkFile.exists()
					&& checkFile.length() == Integer.parseInt(chunkSize)) {
				// 上传过
				response.getWriter().write("{\"ifExist\":1}");
			} else {
				// 没有上传过
				response.getWriter().write("{\"ifExist\":0}");
			}
		}

	}

你可能感兴趣的:(webuploader大文件 分片 断点续传)