问题如下:
我首先通过文件上传取得了一个inputstream,这时如果我直接对这个流进行MD5的话,之后便无法保存文件了,应该是流已经被读取过无法再次读取。
MD5计算用的是apache commons-codec:
String md5 = DigestUtils.md5Hex(inputStream); // 之后无法保存文件
FileUtils.copyInputStreamToFile(inputStream, file); // 无法保存文件
请问有什么办法既能够得到MD5又能够保存文件呢,在只用inputstream的情况下,不要把流读入一个byte数组,我并不知道它多大。
Tout d'abord, le moyen le plus simple est de combiner vos deux lignes de code, de sauvegarder d'abord le fichier, puis de lire le flux du fichier pour calculer MD5 :
Bien sûr, cela nécessite de lire deux fois le même flux, ce qui n'est pas décarboné et respectueux de l'environnement.
À ce stade, vous pouvez consulter le code source de DigestUtils et retracer ses origines et vous pouvez voir :
Ce n'est pas une technologie très avancée, il s'agit de diviser l'intégralité de l'InputStream en tableaux d'octets de longueur 1024 et de les MD5 un par un.
Regardez l'implémentation de la traçabilité du code source FileUtils.copyInputStreamToFile :
Il parle également de diviser le InputStream en un tableau de 4096 octets et de l'écrire un par un dans le fichier cible.
Ensuite, le code sera plus simple à écrire en combinant les deux :
inputstream
ne peut être lu qu'une seule fois. Enregistrez d'abord le fichier, puis ouvrez le flux de ce fichier pour obtenirmd5
.Quelqu'un a posé cette question sur SO :
http://stackoverflow.com/ques...
L'idée est d'utiliser
ByteArrayOutputStream
pour mettre d'abord le contenu de inputstream dans le tableau byte[], puis d'utiliserByteArrayInputStream
pour le lire.Le pointeur inputStream après le calcul md5 a pointé vers la fin
Il n'y a donc aucune donnée à sauvegarder lors de la sauvegarde
En utilisant la marque et la réinitialisation de inputStream, vous pouvez pointer le pointeur vers la fin, puis revenir à la position de la marque, mais vous devez d'abord envelopper le inputStream dans un type BufferedInputStream