java - 如何计算Inputstream的MD5
黄舟
黄舟 2017-04-18 09:55:55
0
4
997

问题如下:

我首先通过文件上传取得了一个inputstream,这时如果我直接对这个流进行MD5的话,之后便无法保存文件了,应该是流已经被读取过无法再次读取。

MD5计算用的是apache commons-codec:
String md5 = DigestUtils.md5Hex(inputStream); // 之后无法保存文件
FileUtils.copyInputStreamToFile(inputStream, file); // 无法保存文件

请问有什么办法既能够得到MD5又能够保存文件呢,在只用inputstream的情况下,不要把流读入一个byte数组,我并不知道它多大。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全員に返信(4)
黄舟

まず、最も簡単な方法は、2 行のコードを結合し、最初にファイルを保存してから、ファイル ストリームを読み取って MD5 を計算することです。

リーリー

もちろん、これには同じストリームを 2 回読み取る必要がありますが、これは低炭素で環境に優しいものではありません。

この時点で、DigestUtils のソース コードを見てその起源をたどると、次のことがわかります。

リーリー

これはそれほど高度なテクノロジーではありません。InputStream 全体を長さ 1024 のバイト配列に分割し、それらを 1 つずつ MD5 します。

FileUtils.copyInputStreamToFile ソース コードのトレーサビリティ実装を見てください:

リーリー

InputStream を 4096 バイトの配列に分割し、ターゲット ファイルに 1 つずつ書き込む方法についても説明します。

次に、この 2 つを組み合わせるとコードが書きやすくなります。

リーリー
いいねを押す +0
大家讲道理

inputstream は 1 回だけ読み取ることができます。まずファイルを保存してから、このファイルのストリームを開いて md5 を取得します。

いいねを押す +0
左手右手慢动作

誰かが SO でこの質問をしました:
http://stackoverflow.com/ques...

このアイデアは、ByteArrayOutputStream を使用してまず inputstream の内容を byte[] 配列に入れ、次に ByteArrayInputStream を使用してそれを読み取ることです。

リーリー
いいねを押す +0
迷茫

md5 計算後の inputStream ポインタが終端を指しているため
保存時に保存するデータがありません

inputStream のマークとリセットを使用すると、ポインタを末尾にポイントしてからマークの位置に戻ることができますが、最初に inputStream を BufferedInputStream 型にラップする必要があります

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート