方法
public Multimap<String, String> getCodeBucketMultimap(HttpServletRequest request)
throws IOException {
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 基于servlet获取文件流
List<MultipartFile> multipartFileList = multiRequest.getFiles("FILE");
if (CollUtil.isEmpty(multipartFileList)) {
return ArrayListMultimap.create();
}
MultipartFile multipartFile = CollUtil.getFirst(multipartFileList);
String multipartFileName = multipartFile.getOriginalFilename();
Preconditions.checkState(
StrUtil.endWithIgnoreCase(multipartFileName, ".zip"), "非压缩包文件,需要上传Zip压缩包文件");
// 返回给业务处理的数据
ArrayListMultimap resultMultimap = ArrayListMultimap.create();
File zipFile = FileUtil.createTempFile(IdUtil.fastSimpleUUID(), ".zip", true);
File outZipPath =
new File(StrUtil.join(zipFile.getParent(), File.separator, IdUtil.fastSimpleUUID()));
try (InputStream instream = multipartFile.getInputStream()) {
// 保存zip文件
FileUtil.writeFromStream(instream, zipFile);
// 解压文件
ZipUtil.unzip(zipFile, outZipPath, CharsetUtil.CHARSET_GBK);
List<File> fileList =
FileUtil.loopFiles(outZipPath, pathname -> FileUtil.size(pathname) >= 1);
ImmutableList<String> immutableList =
ImmutableList.<String>builder().add("基础信息", "图纸预览", "其他附件").build();
fileList.stream()
.filter(
file -> {
// 过滤掉其他的压缩文件内容
String parentName = new File(file.getParent()).getName().trim();
return immutableList.contains(parentName);
})
.forEach(
file -> {
String parentName = new File(file.getParent()).getName();
String fileName = getCode(file.getName());
String code = getCode(file);
// 增加的识别逻辑
String rowkey = StrUtil.format("{}@{}@{}", code, parentName, fileName);
try (InputStream fileInputStream = new FileInputStream(file.getPath())) {
Document fileInfoDoc = fileStorageService.storeFile(fileInputStream, fileName);
String fileInfoId = DocuLib.getStr(fileInfoDoc, "id");
resultMultimap.put(rowkey, fileInfoId);
} catch (Exception ex) {
LOGGER.error("", ex);
}
});
} finally {
FileUtil.del(zipFile);
FileUtil.del(outZipPath);
}
return resultMultimap;
}
private String getCode(String code) {
if (StrUtil.contains(code, "-")) {
code = CollUtil.getLast(StrUtil.splitTrim(code, "-"));
}
return code;
}
private static String getCode(File file) {
String code = file.getName();
int index = code.indexOf(".");
if (index > 0) {
code = StrUtil.subBefore(code, ".", false);
}
if (StrUtil.contains(code, "-")) {
code = CollUtil.getFirst(StrUtil.splitTrim(code, "-"));
}
return code;
}
前端
<input type="file" id="fileInput" style="display: none;">
<!-- 使用一个按钮来触发文件选择 -->
<button class='btn btn-outline-primary btn-sm' ng-click='ctrl.triggerFileUpload()'
ng-if="''| SecurityFilter: 'materialType':'importAttachment'"
type='button'>
<i class='bi'></i>
图片及附件导入
</button>
triggerFileUpload: function () {
// 触发隐藏的文件选择框的点击事件
var fileInput = document.getElementById('fileInput');
// 移除之前的 change 事件处理器
fileInput.removeEventListener('change', fileInput._changeHandler);
// 为文件选择框添加新的 click 事件处理器
fileInput.addEventListener('click', function () {
fileInput.value = ''; // 清空文件输入框的值,以便下次选择文件
});
// 为文件选择框添加新的 change 事件处理器
fileInput._changeHandler = function () {
if (this.files.length > 0) {
ctrl.uploadFile(this.files[0]);
}
};
fileInput.addEventListener('change', fileInput._changeHandler);
fileInput.click();
},
uploadFile: function (file) {
var formData = new FormData();
formData.append('FILE', file);
$.ajax({
type: "post",
url: skybird.c_path + "/materialType/upload",
data: formData,
contentType: false,
processData: false,
dataType: "json",
success: function (response) {
if (!response.success) {
dialog.noty(response.messages[0]);
return;
}
dialog.noty('导入成功');
}
});
},
后端Java接口
@PostMapping("/upload")
public CheckMessage uploadFile(HttpServletRequest request, HttpServletResponse response) {
try {
Multimap<String, String> codeBucketMultimap =
materialTypeService.getCodeBucketMultimap(request);
List<String> codeList = new ArrayList<>();
codeBucketMultimap.forEach(
(key, value) -> {
List<String> list = StrUtil.splitTrim(key, "@");
codeList.add(list.get(0));
});
List<Document> list =
DBUtils.list(
materialType.collectionName,
DocuLib.newDoc("materialCode", DocuLib.newDoc("$in", codeList)));
Map<String, Document> dtoMap =
list.stream()
.collect(
Collectors.toMap(
doc -> DocuLib.getStr(doc, "materialCode"), doc -> doc, (k, v) -> k));
String time = DateUtils.getDateTime();
codeBucketMultimap
.asMap()
.forEach(
(key, value) -> {
List<String> row = StrUtil.splitTrim(key, "@");
Document dto = dtoMap.getOrDefault(row.get(0), new Document());
if (ObjectUtils.isNotEmpty(dto)) {
value.forEach(
item -> {
// 图片直接更新
if (StringLib.equals(row.get(1), "基础信息") && isJpegPngJpg(row.get(2))) {
dto.put("materialShow", item);
}
// 图纸限制1张
if (StringLib.equals(row.get(1), "图纸预览") && isPdfPngJpg(row.get(2))) {
List<Document> drawingPreviewList =
DocuLib.getList(dto, "drawingPreviewList");
if (ObjectUtils.isEmpty(drawingPreviewList)) {
drawingPreviewList = new ArrayList<>();
Document newDoc = DocuLib.newDoc();
newDoc.put("id", item);
newDoc.put("code", row.get(2));
newDoc.put("uploadDate", time);
drawingPreviewList.add(newDoc);
dto.put("drawingPreviewList", drawingPreviewList);
}
}
// 其他附件直接新增
if (StringLib.equals(row.get(1), "其他附件")) {
List<Document> otherAttachmentsList =
DocuLib.getList(dto, "otherAttachmentsList");
if (ObjectUtils.isEmpty(otherAttachmentsList)) {
otherAttachmentsList = new ArrayList<>();
}
Document newDoc = DocuLib.newDoc();
newDoc.put("id", item);
newDoc.put("code", row.get(2));
newDoc.put("uploadDate", time);
otherAttachmentsList.add(newDoc);
dto.put("otherAttachmentsList", otherAttachmentsList);
}
});
}
});
if (CollectionUtils.isNotEmpty(list)) {
List<UpdateOneModel> updateLists = Lists.newArrayList();
list.stream()
.forEach(
item -> {
UpdateOneModel updateOneModel =
new UpdateOneModel(
Filters.eq("_id", DocuLib.getObjectId(item)),
DocuLib.newDoc("$set", item));
updateLists.add(updateOneModel);
});
DBUtils.bulkWrite(materialType.collectionName, updateLists);
}
return CheckMessage.newInstance();
} catch (Exception e) {
return CheckMessage.newInstance()
.setSuccess(false)
.addMessage("请上传Zip压缩包文件并包含基础信息,图纸预览,其他附件文件夹");
}
}
public static boolean isPdfPngJpg(String fileName) {
// 将文件名转换为小写,以便不区分大小写地进行比较
String lowerCaseFileName = fileName.toLowerCase();
// 检查文件扩展名
if (lowerCaseFileName.endsWith(".pdf")
|| lowerCaseFileName.endsWith(".png")
|| lowerCaseFileName.endsWith(".jpg")) {
return true;
}
return false;
}
public static boolean isJpegPngJpg(String fileName) {
// 将文件名转换为小写,以便不区分大小写地进行比较
String lowerCaseFileName = fileName.toLowerCase();
// 检查文件扩展名
if (lowerCaseFileName.endsWith(".jpeg")
|| lowerCaseFileName.endsWith(".png")
|| lowerCaseFileName.endsWith(".jpg")) {
return true;
}
return false;
}