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