排查附件问题,支撑上线。 在凌晨支撑了上线,算是第一次接触了上线业务,感觉对整个的开发流程掌握的更多了。 在早晨被告知了,信安附件校验问题。 下午开始排查,做了自己的第一个工具类,可以进行文件魔数校验: ```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 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; } } ```