2012-06-26 4 views
2

J'utilise le pilote java MongoDB pour gridfs et je voudrais utiliser le hachage MD5 pour vérifier si un fichier existe déjà avant de l'enregistrer. Essentiellement, j'essaie de faire this en Java.Comment calculer MD5 d'un fichier avant de l'enregistrer dans gridfs

J'ai essayé DigestUtils de apache-codec commun avec la logique suivante:

public GridFSDBFile save(InputStream inputStream, String contentType, String filename) throws IOException { 
    String md5 = DigestUtils.md5Hex(inputStream); 

    List<GridFSDBFile> md5match = gridFs.find(new BasicDBObject("md5", md5)); 

    if (md5match!=null && md5match.size()>0) { 
     return md5match.get(0); 
    } else { 
     GridFSInputFile input = gridFs.createFile(inputStream, filename, true); 
     input.save(); 
     return gridFs.findOne(input.getId()) 
    } 
} 

Regarder la mise en œuvre sous-jacente, à la fois DigestUtils et pilote MongoDB utilise MessageDigest.getInstance ("MD5") pour le calcul de hachage MD5. Cependant, il semble que le code de hachage md5 généré par DigestUtils ne soit pas le même que ce que gridfs génère. Remplacer la clé "md5" dans GridFSInputFile ne fonctionne pas non plus.

Répondre

3

La réponse s'avère n'avoir rien à voir avec le pilote Mongodb. Pour calculer le hachage md5, DigestUtils doit lire le InputStream. Pour que le code ci-dessus fonctionne correctement, utilisez la marque/réinitialiser:

inputStream.mark(Integer.MAX_VALUE); 
String md5 = DigestUtils.md5Hex(inputStream); 
inputStream.reset(); 
Questions connexes