问题如下:
我首先通过文件上传取得了一个inputstream,这时如果我直接对这个流进行MD5的话,之后便无法保存文件了,应该是流已经被读取过无法再次读取。
MD5计算用的是apache commons-codec:
String md5 = DigestUtils.md5Hex(inputStream); // 之后无法保存文件
FileUtils.copyInputStreamToFile(inputStream, file); // 无法保存文件
请问有什么办法既能够得到MD5又能够保存文件呢,在只用inputstream的情况下,不要把流读入一个byte数组,我并不知道它多大。
Pertama sekali, cara paling mudah ialah menggabungkan dua baris kod anda, simpan fail dahulu, dan kemudian baca strim fail untuk mengira MD5:
Sudah tentu, ini memerlukan membaca aliran yang sama dua kali, yang tidak rendah karbon dan mesra alam.
Pada ketika ini anda boleh melihat kod sumber DigestUtils dan mengesan asal usulnya dan anda boleh melihat:
Ia bukan teknologi yang sangat canggih, ia adalah untuk membahagikan keseluruhan InputStream kepada tatasusunan bait dengan panjang 1024 dan MD5 mereka satu demi satu.
Lihat pelaksanaan kebolehkesanan kod sumber FileUtils.copyInputStreamToFile:
Ia juga membincangkan tentang memisahkan InputStream kepada tatasusunan 4096 bait dan menulisnya pada fail sasaran satu demi satu.
Kemudian, kod akan lebih mudah untuk ditulis dengan menggabungkan dua:
inputstream
hanya boleh dibaca sekali Simpan fail dahulu dan kemudian buka strim fail ini untuk mendapatkanmd5
.Seseorang bertanya soalan ini pada SO:
http://stackoverflow.com/ques...
Ideanya ialah menggunakan
ByteArrayOutputStream
untuk meletakkan kandungan aliran masukan ke dalam tatasusunan bait[] dahulu, dan kemudian gunakanByteArrayInputStream
untuk membacanya.Penunjuk bagi inputStream selepas pengiraan md5 telah pun menghala ke penghujung
Jadi tiada data untuk disimpan semasa menyimpan
Menggunakan tanda inputStream dan set semula, anda boleh menghalakan penuding ke hujung dan kemudian kembali ke kedudukan tanda, tetapi anda perlu membalut inputStream ke dalam jenis BufferedInputStream dahulu