宋子宪博客

Spring Boot整合Hutool实现防止文件重复上传

1.需要先搭建Spring Boot工程
2.引入hutool工具类依赖

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.4</version>
</dependency>

文档:Spring MVC的MultipartFile接口常用API

方法功能描述
String getOriginalFilename()获取上传文件的原始文件名,即该文件在客户端中的文件名
boolean isEmpty()判断上传的文件是否为空,当没有选择文件就直接上传,或者选中的文件是0字节的空文件时,返回true,否则返回false
long getSize()获取上传的文件大小,以字节为单位
String getContentType()根据所上传的文件的扩展名决定该文件的MIME类型,例如上传.jpg格式的图片,将返回image/jpeg
InputStream getInputStream()获取上传文件的输入字节流,通常用于自定义读取所上传的文件的过程,该方法与transferTo()方法不可以同时使用
void transferTo(File dest)保存上传的文件,该方法与getInputStream()方法不可以同时使用

核心代码

/**
     * description 文件上传
     *
     * @return {@link AjaxResult}
     * @param: [multipartFile]
     * @Date 2022/7/16
     */
    @PostMapping("fileUpload")
    public String fileUpload(MultipartFile multipartFile) throws IOException {
        String PATH = "D:\\file\\";
        log.info("multipartFile:{}", multipartFile);
        //判断上传的文件是否为空
        if (multipartFile ==null || multipartFile.isEmpty()){
            return "请选选择文件再上传,参数名multipartFile";
        }
        String contentType = multipartFile.getContentType();
        log.info("文件类型:{}",contentType);
        //获取文件名
        String fileName = multipartFile.getOriginalFilename();
        //获取文件后缀名 没有点符号
        String fileSuffix = FileUtil.extName(fileName);
        //限制文件类型
        if (!(fileSuffix.equals("jpg") || fileSuffix.equals("png") || fileSuffix.equals("xls") || fileSuffix.equals("xlsx"))) {
            return "当前只支持上传:jpg png xls xlsx类型";
        }
        //获取文件大小
        long size = multipartFile.getSize();
        //使用时间戳+3位随机数作为新的文件名
        long milli = Instant.now().toEpochMilli();
        String randomNumbers = RandomUtil.randomNumbers(3);
        //生成新的文件名
        String newFileName = milli + randomNumbers + "." + fileSuffix;
        //创建文件夹,如果存在则不创建
        FileUtil.mkdir(PATH);
        //文件路径
        String filePath = PATH + newFileName;
        //生成文件唯一has256值
        String shaValue = DigestUtil.sha256Hex(multipartFile.getBytes());
        //相同的文件每次上传has256值都是一样的,可以根据该值判断文件是否存在
        if (shaValue.equals("数据库中的has256值")) {
            return "改文件已存在";
        }
        log.info("has256:{}", shaValue);
        try {
            //实现文件存储
            FileUtil.writeBytes(multipartFile.getBytes(), filePath);
            return "文件上传成功";
        } catch (IOException e) {
            log.error("文件上传失败 报错信息:{}", e);
            return "文件上传失败,错误信息:" + e;
        }
    }

yml参数作用如下:
spring.servlet.multipart.enabled:表示是否开启文件上传支持,默认为 true
spring.servlet.multipart.file-size-threshold:表示文件写入磁盘的阀值,默认为 0
spring.servlet.multipart.location:表示上传文件的临时保存位置
spring.servlet.multipart.max-file-size:表示上传的单个文件的最大大小,默认为 1MB
spring.servlet.multipart.max-request-size:表示多文件上传时文件的总大小,默认为 10MB
spring.servlet.multipart.resolve-lazily:表示文件是否延迟解析,默认为 false

spring:
  servlet:
    multipart:
      max-file-size: 20MB
      max-request-size: 200MB

文件上传到这里就结束了
ps:如果后面需要物理删除文件可以调用以下Api

//删除单个文件
FileUtil.del("D:\\file\\test.txt");
//删除整个文件夹(慎用)
FileUtil.del(D:\\file\\)

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »