Java SpringMVC上传文件并去重(MD5中MappedByteBuffer的坑)

本文介绍了在Java SpringMVC中实现文件上传去重的两种思路,着重讨论了使用MD5值作为文件名时遇到的MappedByteBuffer导致文件无法删除的问题。通过分析,发现MappedByteBuffer在内存映射文件时可能导致文件占用,从而影响删除操作。为解决此问题,作者改用从MultipartFile的输入流直接获取MD5值,简化了代码并成功实现了文件上传去重。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写一个管理系统,有图片上传的需求。使用SpringMVC的MultipartFile很好实现,就不赘述。之前一直使用随机生成的文件名保存文件去重,但是这样无法保证文件的唯一性,之后自己想着添加一个唯一去重的功能,首先想到了MD5的。

正好我在使用的MD5工具类中有getFileMD5方法,所以第一版本直接使用工具类的方法获取文件MD5:

思路1: 先将接受到的MultipartFile对象转换成File对象,然后获取MD5值,用MD5值作为文件名保存文件,删掉临时保存的File文件;

/**

     * 图片上传去重,错误代码

     *

     *@paramimage

     */

    @RequestMapping("/upload")

    publicvoidupload(@RequestParamMultipartFilemultipartFile) {

         try{

             if(multipartFile!=null) {

                 // 获取文件原名

                 StringoriginalFilename=multipartFile.getOriginalFilename();

                 // 获取文件扩展名

                 Stringextension= FileUtils.getExtensionByName(originalFilename);

                 // 随机生成唯一临时名称

                 StringuuidString= CommonUtil.getUUIDString(32);

                 StringnewFileName=uuidString+"."+extension;

                 // 将文件临时保存

                 Filedest=newFile(savePath,newFileName);

                 if(!dest.getParentFile().exists()) {

                      dest.getParentFile().mkdirs();

                 }

                 multipartFile.transferTo(dest);

                 // 获取文件MD5值

                 StringfileMD5= MD5.getFileMD5(dest);

                 // 将MD5值作为最终文件名

                 StringfinalName=fileMD5+"."+extension;

                 FilefinalFile=newFile(dest.getParent() +"/"+finalName);

                 if(!finalFile.exists()) {

                      // 复制文件</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值