Files
notes/calendar/diary/2023年/2023-01-05.md
T
2026-03-01 01:43:46 +08:00

2.0 KiB

排查附件问题,支撑上线。

在凌晨支撑了上线,算是第一次接触了上线业务,感觉对整个的开发流程掌握的更多了。

在早晨被告知了,信安附件校验问题。

下午开始排查,做了自己的第一个工具类,可以进行文件魔数校验:


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);

}


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;

}

}