- 创建ConCurrentHashMap用于存储算法加密对象
String为上传文件的唯一识别码,MessageDigest为算法加密对象,持续计算文件hash/** String:上传文件的唯一标识,MessageDigest:算法加密对象,用于持续更新文件hash */ private ConcurrentHashMap<String, MessageDigest> md5HashMap = new ConcurrentHashMap<>();
- 开始/创建文件MD5Hash计算
/** * 开始第一次Hash * @author madechao * @description 开始第一次Hash * @createTime 11:13 2022/1/12 * @param inputStream 文件输入流 * @param identifier 上传文件唯一码 * @return boolean 是否创建成功 */ public boolean startDigest(InputStream inputStream, String identifier) throws IOException { MessageDigest digest = null; if (md5HashMap.get(identifier) == null){ try { digest = MessageDigest.getInstance(MessageDigestAlgorithms.MD5); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } updateStreamDig(inputStream, digest); md5HashMap.put(identifier, digest); } return digest != null; }
创建并开始第一块文件MD5Hash计算,并将MessageDigest按文件唯一识别码identifier存储进ConCurrentHashMap
-
通过后续上传分片文件更新Hash
/** * 后续更新Hash * @author madechao * @description 后续更新Hash * @createTime 11:13 2022/1/12 * @param inputStream 文件输入流 * @param identifier 上传文件唯一码 * @return boolean 是否更新成功 */ public boolean updateDigest(InputStream inputStream, String identifier) throws IOException { MessageDigest digest = md5HashMap.get(identifier); if (digest == null){ return false; } updateStreamDig(inputStream, digest); return true; }
将后续上传的分片文件流追加计算
-
获取上传文件的Hash
/** * 上传完成后获取Hash字符串 * @author madechao * @description 上传完成后获取Hash字符串 * @createTime 11:14 2022/1/12 * @param identifier 上传文件唯一码 * @return java.lang.String 文件最终hash */ public String getFileMD5Hash(String identifier){ String hash = null; MessageDigest digest = md5HashMap.get(identifier); if (digest != null){ hash = Hex.encodeHexString(digest.digest()); } return hash; }
获取上传大文件的hash
-
计算完成后删除算法加密对象
/** * 删除算法加密对象 * @author madechao * @description 删除算法加密对象 * @createTime 11:14 2022/1/12 * @param identifier * @return boolean */ public boolean deleteDigest(String identifier){ return this.md5HashMap.remove(identifier) != null; }
计算完成后删除算法加密对象
-
更新文件hash操作
/** * 更新文件hash操作 * @author madechao * @description 上传完成后获取Hash字符串 * @createTime 11:14 2022/1/12 * @param inputStream 文件输入流 * @param digest 算法加密对象 */ private void updateStreamDig(InputStream inputStream, MessageDigest digest) throws IOException { int bufferSize = 1024; byte [] buffer = new byte[bufferSize]; int read = inputStream.read(buffer, 0, bufferSize); while (read != -1){ digest.update(buffer, 0, read); read = inputStream.read(buffer, 0, bufferSize); } }
具体的文件hash更新操作
-
至此文件分片上传计算hash工具完成,完整代码后续上传
SpringBoot大文件分片上传时文件的MD5Hash计算
最新推荐文章于 2024-04-23 17:25:12 发布