如何在保存到gridfs之前计算文件的MD5

时间:2012-06-26 15:43:55

标签: mongodb gridfs

我正在为gridfs使用java MongoDB驱动程序,并希望在保存之前使用MD5哈希检查文件是否已存在。基本上我正在尝试用Java做this

我使用以下逻辑从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())
    }
}

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

1 个答案:

答案 0 :(得分:3)

答案结果与Mongodb驱动程序无关。为了计算md5哈希值,DigestUtils必须通过InputStream读取。为了使上述代码正常工作,请使用mark / reset:

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