将一份数据文件通过网络上传到一个文件系统时,再下载该文件一般要进行md5校验,但结果总是不一样的。
GetObjectArgs getObjectArgs = GetObjectArgs.builder().bucket("testbucket").object("/test01/0001.png").build(); InputStream re = minioClient.getObject(getObjectArgs);
// 下载到本地 FileOutputStream fileOutputStream = new FileOutputStream(new File("F:\\1.png")); IOUtils.copy(re,fileOutputStream); String s1 = DigestUtils.md5Hex(re); String s2 = DigestUtils.md5Hex(Files.newInputStream(new File("F:\\1.png").toPath()));
System.out.println(s1); System.out.println(s2);
如果同一份数据在网络输入流和文件输入流中计算的MD5值不一样,可能是由以下原因造成:
数据传输中的差异:
在网络传输过程中,数据可能会受到传输错误、丢失、重传等因素的影响。即使是同一份数据,如果在传输过程中发生了任何错误或丢失数据的情况,接收方获取到的数据可能会与原始数据有所不同,这将导致计算出的MD5值不同。
编码或解码问题:
网络传输中的数据通常需要进行编码和解码,例如将数据转换为字节流进行传输。如果编码或解码的方式不同或存在错误,会导致接收方获取到的数据与原始数据不完全一致,进而导致MD5值的差异。
文件格式或元数据的差异:
如果将数据写入文件时附加了一些额外的文件格式信息或元数据,例如文件头、时间戳等,那么计算文件输入流的MD5值时会将这些额外信息也纳入计算,而网络输入流可能不包含这些信息,因此计算出的MD5值会不同。
环境或系统差异:
不同的操作系统、网络环境、硬件设备等可能会对数据传输和处理过程产生微小的影响,这些微小的差异可能会导致计算MD5值时的细微差异。
总之,即使是同一份数据,在网络输入流和文件输入流中计算的MD5值可能不同,主要是由于数据传输和处理过程中的差异所引起的。
解决方案
不要去计算网络的输入流来计算md5值来比较,而是先下载到本地,得到一个文件,然后再用这个本地文件得到的输入流来计算md5,然后与之前上传的文件得到的md5才能一致。