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