3

我正在使用用于 gridfs 的 java MongoDB 驱动程序,并且想在保存文件之前使用 MD5 哈希来检查文件是否已经存在。本质上,我试图在 Java中做到这一点。

我从 apache common-codec 尝试DigestUtils了以下逻辑:

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())
    }
}

查看底层实现,DigestUtilsMongoDB 驱动程序都使用 MessageDigest.getInstance("MD5") 来计算 MD5 哈希。但是,看起来 生成的 md5 哈希码DigestUtils与 gridfs 生成的不一样。覆盖 GridFSInputFile 中的“md5”键也不起作用。

4

1 回答 1

3

答案原来与 Mongodb 驱动无关。为了计算 md5 哈希,DigestUtils 必须通读 InputStream。为了使上述代码正常工作,请使用标记/重置:

inputStream.mark(Integer.MAX_VALUE);
String md5 = DigestUtils.md5Hex(inputStream);
inputStream.reset();
于 2012-06-26T19:14:57.933 回答