Files
2026-03-01 01:43:46 +08:00

104 lines
2.0 KiB
Markdown

排查附件问题,支撑上线。
在凌晨支撑了上线,算是第一次接触了上线业务,感觉对整个的开发流程掌握的更多了。
在早晨被告知了,信安附件校验问题。
下午开始排查,做了自己的第一个工具类,可以进行文件魔数校验:
```java
private static String getUpperCaseHexString(byte[] file) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < HEADER_LENGTH; i++) {
int v = file[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
sb.append(0);
}
sb.append(hv);
}
return sb.toString().toUpperCase(Locale.ENGLISH);
}
```
```java
log.info("开始校验是否是非法文件");
List<String> defaultFileHeaderList = new ArrayList<>();
//XLS格式8位魔法数字
defaultFileHeaderList.add("D0CF11E0");
//XLSX格式8位魔法数字
defaultFileHeaderList.add("504B0304");
//获取信安附件文件类型-由文件名获得-fileName不为空,上方有初始化
String fileSuffix = fileName.substring(fileName.lastIndexOf(".") + 1);
log.info("由文件名获取得文件类型是{}", fileSuffix);
if (!ObjectUtils.isEmpty(bytes)) {
//获取实际附件请求头-由附件bytes得到-8位
String fileHead = getUpperCaseHexString(bytes);
log.info("由实际附件获取得文件16位校验码是{}", fileHead);
//如果实际文件和获取的文件8位校验码不相符则为非法文件。
if (defaultFileHeaderList.stream().noneMatch(fileHead::startsWith)) {
log.info("文件不合法,返回空,不进行信安附件校验");
return null;
} else if (!ObjectUtils.isEmpty(httpResponse) && !ObjectUtils.isEmpty(bytes)) {
//如果MongoDB找不到文件,从远程拉去的文件,保存到附件表
ByteArrayInputStream byteIn = new ByteArrayInputStream(bytes);
// 保存文件
FileInfoPO gridFSFile;
try {
gridFSFile = fileService.storageBackContent(byteIn, fileName);
} catch (Exception e) {
log.error("文件信息保存到数据库失败{}", e.getMessage(), e);
return null;
}
byteIn.close();
return gridFSFile;
}
}
```