[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", "内部错误");
}
}