Java判断上传文件是否重复

近期的项目中接到一个需求,文件上传时,如果是重复文件,直接将文件路径复制一份,不去真的上传。

背景:
文件服务器选择的是Fastdfs,数据库中有一个对应的File表保存文件存储路径以及MD5值。

思路:
要判断文件是否重复,就需要对每次上传的文件计算MD5值,上传前通过查询文件库中是否存在该MD5值,来判断是选择上传还是直接复制已存在的文件路径。

方法一:
使用org.apache.commons.codec.digest.DigestUtils类,一行代码搞定。

// 获取上传文件的MD5值
String md5 = DigestUtils.md5Hex(file.getBytes());
// 判断该文件是否在文件服务器上存在
List<String> filepathList = fileService.FileMd5IsExit(md5);
// 存放文件路径
String path = null;
if (CollectionUtils.isNotEmpty(filepathList)) {
	path = filepathList.get(0);
} else {
	// 文件上传
	path = fileStore.saveFile(file.getBytes(), extension);
}              

方法二:
java.security.MessageDigest java自带的加密类

// 获取上传文件的MD5值
InputStream inputStream = file.getInputStream();
byte[] buffer = new byte[1024];
int length = -1;
while ((length = inputStream.read(buffer, 0, 1024)) > 0) {
	messageDigest.update(buffer, 0, length);
 }
inputStream.close();
String md52 =  new BigInteger(1, messageDigest.digest()).toString(16);

经验证,两种方式加密的结果一样。
md5加密

总结:
两种方案均可以实现需求,我个人倾向于选择方案一,简单。


------------本文结束感谢您的阅读------------
  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
实现java上传多个文件的方法有多种,以下是一种常用的实现方式: 1. 创建表单:在html页面中创建一个表单,用于上传多个文件。表单中包含一个file类型的input元素,可以通过设置multiple属性来支持上传多个文件。 2. 构建后台处理代码:在java后台中,使用Servlet或者SpringMVC等框架构建上传文件的处理方法。处理方法需要获取表单提交的文件数据,通常使用Apache Commons FileUpload等库来处理文件上传请求。 3. 解析文件数据:在文件上传处理方法中解析表单提交的文件数据,通常使用Apache Commons FileUpload等库来实现。解析后得到的数据是一个FileItem集合,其中每个FileItem表示一个上传的文件。 4. 循环处理文件:遍历文件集合,对每个文件进行处理,如保存到服务器、数据库或者其他目的地等。 以下是一个简单的代码示例: HTML页面: ```html <form action="fileUploadServlet" method="post" enctype="multipart/form-data"> <input type="file" name="fileUpload" multiple> <button type="submit">上传文件</button> </form> ``` Java后台处理代码: ```java // 处理文件上传请求 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 创建文件上传处理器 ServletFileUpload upload = new ServletFileUpload(); try { // 解析上传的文件数据 List<FileItem> items = upload.parseRequest(request); // 遍历文件集合,对每个文件进行处理 for (FileItem item : items) { // 判断表单项是否文件上传项 if (!item.isFormField()) { // 获取文件名 String fileName = item.getName(); // 处理上传的文件,如保存到服务器、数据库或者其他目的地等 // ... } } } catch (FileUploadException e) { // 处理文件上传异常 e.printStackTrace(); } } ``` 需要注意的是,上述代码只是一个简单的示例,实际应用中需要根据具体需求进行修改和完善。例如,需要添加文件大小、类型、重复上传等限制,同时为了提高安全性和可靠性,还需要处理文件上传异常和错误情况。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值