WebUploader的java后端上传代码(支持分片上传)
用到了apache的fileupload组件 </div>
[Java]代码
public void fileUpload(HttpServletRequest request, HttpServletResponse response) throws ServletException { try { String path = request.getParameter("path"); path = path != null ? java.net.URLDecoder.decode(path, "utf-8") : ""; boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) { FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); // 得到所有的表单域,它们目前都被当作FileItem List<FileItem> fileItems = upload.parseRequest(request); String id = ""; String fileName = ""; // 如果大于1说明是分片处理 int chunks = 1; int chunk = 0; FileItem tempFileItem = null; for (FileItem fileItem : fileItems) { if (fileItem.getFieldName().equals("id")) { id = fileItem.getString(); } else if (fileItem.getFieldName().equals("name")) { fileName = new String(fileItem.getString().getBytes( "ISO-8859-1"), "UTF-8"); } else if (fileItem.getFieldName().equals("chunks")) { chunks = NumberUtils.toInt(fileItem.getString()); } else if (fileItem.getFieldName().equals("chunk")) { chunk = NumberUtils.toInt(fileItem.getString()); } else if (fileItem.getFieldName().equals("file")) { tempFileItem = fileItem; } } // 临时目录用来存放所有分片文件 String tempFileDir = getTempFilePath() + File.separator + id; File parentFileDir = new File(tempFileDir); if (!parentFileDir.exists()) { parentFileDir.mkdirs(); } // 分片处理时,前台会多次调用上传接口,每次都会上传文件的一部分到后台(默认每片为5M) File tempPartFile = new File(parentFileDir, fileName + "_" + chunk + ".part"); FileUtils.copyInputStreamToFile(tempFileItem.getInputStream(), tempPartFile); // 是否全部上传完成 // 所有分片都存在才说明整个文件上传完成 boolean uploadDone = true; for (int i = 0; i < chunks; i++) { File partFile = new File(parentFileDir, fileName + "_" + i + ".part"); if (!partFile.exists()) { uploadDone = false; } } // 所有分片文件都上传完成 // 将所有分片文件合并到一个文件中 if (uploadDone) { File destTempFile = new File(getTempFilePath(), fileName); for (int i = 0; i < chunks; i++) { File partFile = new File(parentFileDir, fileName + "_" + i + ".part"); FileOutputStream destTempfos = new FileOutputStream( destTempFile, true); FileUtils.copyFile(partFile, destTempfos); destTempfos.close(); } // 得到 destTempFile 就是最终的文件 // 添加到文件系统或者存储中 // 删除临时目录中的分片文件 FileUtils.deleteDirectory(parentFileDir); // 删除临时文件 destTempFile.delete(); ResponseUtil.responseSuccess(response, null); } else { // 临时文件创建失败 if (chunk == chunks -1) { FileUtils.deleteDirectory(parentFileDir); ResponseUtil.responseFail(response, "500", "内部错误"); } } } } catch (Exception e) { logger.error(e.getMessage(), e); ResponseUtil.responseFail(response, "500", "内部错误"); } }