在Java环境中检测重复上传文件的最佳方法?

在Java环境中检测重复上传文件的最佳方法?,java,jakarta-ee,file-upload,duplicates,Java,Jakarta Ee,File Upload,Duplicates,作为基于Java的web应用程序的一部分,我将接受上传的.xls和.csv(可能还有其他类型的)文件。每个文件都将使用参数和时间戳的组合进行唯一重命名 我希望能够识别任何重复的文件。我所说的复制是指,完全相同的文件,无论其名称如何。理想情况下,我希望能够在上传后尽快检测到重复项,以便服务器可以在响应中包含此信息。(如果按文件大小划分的处理时间不会造成太多延迟。) 我读过关于在文件上运行MD5并将结果存储为唯一键等内容。。。但我怀疑有更好的方法。(有更好的办法吗?) 任何关于如何最好地解决这一问题

作为基于Java的web应用程序的一部分,我将接受上传的.xls和.csv(可能还有其他类型的)文件。每个文件都将使用参数和时间戳的组合进行唯一重命名

我希望能够识别任何重复的文件。我所说的复制是指,完全相同的文件,无论其名称如何。理想情况下,我希望能够在上传后尽快检测到重复项,以便服务器可以在响应中包含此信息。(如果按文件大小划分的处理时间不会造成太多延迟。)

我读过关于在文件上运行MD5并将结果存储为唯一键等内容。。。但我怀疑有更好的方法。(有更好的办法吗?)

任何关于如何最好地解决这一问题的建议都将不胜感激

谢谢

更新: 我完全不反对使用MD5。过去我在Perl()中使用过几次。我认为在Java世界中,可能会出现另一个(更好的)解决方案。但是,看起来我错了


谢谢大家的回答和评论。我现在对使用MD5感觉很好。

您只需要在代码中添加这样的方法,就完成了。可能没有更好的办法了。所有的工作都已经由Digest API完成了

public static String calc(InputStream is ) {
        String output;
        int read;
        byte[] buffer = new byte[8192];

        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256"); //"MD5");
            while ((read = is.read(buffer)) > 0) {
                digest.update(buffer, 0, read);
            }
            byte[] hash = digest.digest();
            BigInteger bigInt = new BigInteger(1, hash);
            output = bigInt.toString(16);

        } 
        catch (Exception e) {
            e.printStackTrace( System.err );
            return null;
        }
        return output;
    }

在处理上传的文件时,请用一个新的图标装饰
OutputStream
,以便您可以在写入时计算文件摘要。将最终摘要与文件的唯一标识符一起存储在某个位置(可能是文件名的一部分,使用十六进制格式?)

如您所述,存储文件的哈希是一个很好的解决方案。计算哈希是我的建议。为什么您不认为这是一个好方法呢?MD5/SHA是一个很好的解决方案。如果您非常担心防止误报(我的意思是不正确地将文件声明为重复文件),您可以从按摘要进行比较开始,然后如果它们是匹配项,则逐字节进行比较。然而,误判只会在蓄意恶意碰撞的情况下才会发生。顺便问一下,这难道不是某些版本控制系统(如git)背后的全部理念吗?如果它对git来说足够好,那么对我来说也足够好。@Maurice“md5怎么了?”-一点都没有。在过去,我在Perl中使用过几次(使用的容量略有不同)。我认为在Java世界中,可能会出现另一个(更好的)解决方案。但是,根据目前的反应。。。很明显,我好像弄错了。看起来DigestOutputStream正是我需要的。谢谢