在Java环境中检测重复上载文件的最佳方法?
作为基于Java的Web应用程序的一部分,我将接受上传的.xls和.csv(以及可能的其他类型)文件。 每个文件都将使用参数和时间戳的组合进行唯一重命名。
我希望能够识别任何重复的文件。 副本我的意思是,完全相同的文件,无论名称。 理想情况下,我希望能够在上传后尽快检测到重复项,以便服务器可以在响应中包含此信息。 (如果按文件大小处理时间不会造成太多延迟。)
我已经阅读过关于在文件上运行MD5并将结果存储为唯一键等的内容…… 但我怀疑有更好的方法。 (有没有更好的办法?)
关于如何最好地接近这一点的任何建议表示赞赏。
谢谢。
更新:我对使用MD5一无所知。 我过去曾用过Perl( Digest :: MD5 )几次。 我认为在Java世界中,可能会出现另一种( 更好的 )解决方案。 但是,看起来我错了。
谢谢大家的回答和评论。 我现在对使用MD5感觉非常好。
处理上传的文件时,使用DigestOutputStream
修饰OutputStream
,以便在写入时计算文件的摘要。 将最终摘要存储在某处以及文件的唯一标识符(以hexforms作为文件名的一部分?)。
您只需要在代码中添加这样的方法就可以了。 可能没有更好的方法。 所有工作都已由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; }
- 使用java中的Restlet multipart / form-data上传文件
- 为什么我用Apache Commons FileUpload获得“FileUploadException:Stream意外结束”?
- Spring Framework是否支持多部分请求中的流模式
- 从Spring Service使用AJAX GET下载文件
- 如何使用JSoup发布文件?
- Spring mvc:HTTP Status 400 – 必需的MultipartFile参数’file’不存在
- 在playframework中上传多个文件
- j2ee primefaces fileupload文件保存目标
- 为什么这个exceptionFileItemStream $ ItemSkippedException?