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", "內部錯誤"); } }
本文由用戶 hwl0420 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!