问题如下:
我首先通过文件上传取得了一个inputstream,这时如果我直接对这个流进行MD5的话,之后便无法保存文件了,应该是流已经被读取过无法再次读取。
MD5计算用的是apache commons-codec:
String md5 = DigestUtils.md5Hex(inputStream); // 之后无法保存文件
FileUtils.copyInputStreamToFile(inputStream, file); // 无法保存文件
请问有什么办法既能够得到MD5又能够保存文件呢,在只用inputstream的情况下,不要把流读入一个byte数组,我并不知道它多大。
首先,最简单的方式就是把你的两行代码结合起来,先保存文件,再读取文件流计算MD5:
当然这样做要对同一个流读取两次,显得不够低碳环保。
此时可以看下DigestUtils源码,追其根溯其源可以看到:
也不是多高级的技术,就是把整个InputStream拆成长度1024的字节数组逐个MD5。
再看看FileUtils.copyInputStreamToFile源码的追根溯源实现:
同样也是讲InputStream拆成4096的字节数组,逐个写到目标文件中。
那么,两者结合起来代码也就好写了: