public List<String> uploadFiles(String taskId, String caseId, String userName, HttpServletRequest request)
throws Exception {
long startTime = System.currentTimeMillis();
Map<String, Object> result = null;
CommonsMultipartResolver multipartResolver =
new CommonsMultipartResolver(request.getSession().getServletContext());
if (multipartResolver.isMultipart(request)) {
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
Iterator<String> iter = multiRequest.getFileNames();
multiRequest.setCharacterEncoding(DEFAULT_ENCODING);
ArrayList<String> filePaths = new ArrayList<String>();
//批量zip包生成md5临时存储
ArrayList<String> list = new ArrayList<>();
while (iter.hasNext()) {
List<MultipartFile> files = multiRequest.getFiles(iter.next());
for (MultipartFile file : files) {
// 文件大小检测
if (0 == file.getSize()) {
LOGGER.error("file size:{}", file.getSize());
throw new Exception("上传文件" + file.getOriginalFilename() + "不能为空文件");
}
/**
* Zip文件解压缩
*/
String originalFilename = file.getOriginalFilename();
String path = fileUploadConfiguration.getPath() + taskId;
if (originalFilename.substring(originalFilename.lastIndexOf(".") + 1)
.equals(DEFAULT_COMPRESS_TYPE)) {
ZipFile zipFile = null;
try {
File file1 = new File(path + File.separator + originalFilename);
FileUtils.copyInputStreamToFile(file.getInputStream(), file1);
zipFile = new ZipFile(file1, Charset.forName("GBK"));
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry zipEntry = entries.nextElement();
LOGGER.info("unzip" + zipEntry.getName());
if (zipEntry.isDirectory()) {
LOGGER.info("文件夹嵌套");
continue;
} else {
InputStream is = zipFile.getInputStream(zipEntry);
String fileName = zipEntry.getName();
String[] splitDirFileName = fileName.split("/");
String[] suffix = splitDirFileName[1].split("\\.");
String finalFileName = suffix[0] + "_" + splitDirFileName[0] + "." + suffix[1];
String finalPath = path + File.separator + finalFileName;
if (filePaths.contains(finalPath) || zipEntry.getName().contains("任务信息")) {
continue;
}
String path1 = fileSystemService.saveFile(path, finalFileName, is);
is.close();
filePaths.add(path1);
LOGGER.info("{} 上传到本地耗时:{} ms", file.getOriginalFilename(),
System.currentTimeMillis() - startTime);
File finalFile = new File(path1);
MultipartFile multipartFile = new MockMultipartFile("file", finalFile.getName(),
"text/plain", IOUtils.toByteArray(FileUtils.openInputStream(finalFile)));
//批量传zip包核查重复
String md5 = FileSystemService.md5(path1);
if (list.contains(md5)){
LOGGER.info("md5check repeated " + finalFileName);
filePaths.remove(path1);
continue;
} else {
list.add(md5);
}
// MD5校验
try {
md5check(path1, caseId, multipartFile, filePaths);
} catch (FileRepeatedException fe) {
LOGGER.info("md5check repeated " + fe.getMessage());
continue;
}
}
}
} catch (Exception e) {
LOGGER.error("unzip error from ZipUtils", e);
} finally {
if (zipFile != null) {
try {
FileUtils.forceDelete(new File(path + File.separator + file.getOriginalFilename()));
zipFile.close();
} catch (IOException e) {
LOGGER.error("unzip error from ZipUtils finally error", e);
}
}
}
} else {
String finalPath = path + File.separator + file.getOriginalFilename();
if (filePaths.contains(finalPath)) {
continue;
}
path = fileSystemService.saveFile(path, file.getOriginalFilename(), file.getInputStream());
filePaths.add(path);
LOGGER.info("{} 上传到本地耗时:{} ms", file.getOriginalFilename(),
System.currentTimeMillis() - startTime);
// MD5校验
try {
md5check(path, caseId, file, filePaths);
} catch (FileRepeatedException fe) {
LOGGER.info("md5check repeated " + fe.getMessage());
continue;
}
}
}
}
return filePaths;
}
return new ArrayList<String>();
}
public void md5check(String path, String caseId, MultipartFile file, ArrayList<String> filePaths) throws Exception {
// MD5校验
String md5 = FileSystemService.md5(path);
LOGGER.info("文件{},md5={}", path, md5);
CaseFileResource caseFileResource = caseFileResourceDao.findByCaseId(caseId);
LOGGER.info("caseFileResource={}", JsonUtil.toString(caseFileResource));
if (null != caseFileResource) {
for (Map<String, String> md5MapItem : caseFileResource.getMd5Str2FileNames()) {
final String key = md5MapItem.entrySet().iterator().next().getKey();
if (StringUtils.equals(key, md5)) {
FileUtils.deleteQuietly(new File(path));
filePaths.remove(path);
throw new FileRepeatedException(file.getOriginalFilename() + "文件内容已上传过");
}
}
}
}
上传zip压缩文件解压缩(自)
于 2021-05-17 16:13:27 首次发布