文件上传--单个或多个文件上传

单个文件上传

第一种方法:

/**
     * 
     * @param file         需要上传的文件
     * @param baseUrl      上传地址
     * @param uploadName   上传文件如果要更改文件名称,该字段为要更改的名称,不需要更改则该参数应为空字符串或null
     */
    public static void upload(MultipartFile file,String baseUrl,String uploadName){
        // 1、获取文件的原始文件名, 通过原始文件名获取文件后缀 例如:abc.jpg
        String originalFilename = file.getOriginalFilename();
        //后缀文件类型。如:.txt   .png
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //文件前缀名称
        String prefixName = originalFilename.substring(0, originalFilename.lastIndexOf("."));
        // 2、使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
        String fileName = "";
        if (StringUtils.isNotEmpty(uploadName)){
            fileName = uploadName + suffix;
        }else {
            fileName = originalFilename;
        }
        // 3、创建一个目录对象
        File dir = new File(baseUrl);
        //判断当前目录是否存在
        if (!dir.exists()) {
            boolean mkdirs = dir.mkdirs();
            if (!mkdirs) {
                throw new CommonException(CommonCode.FILE_UPDATE_ERROR);
            }
        }
        try {
            // 4、将临时文件转存到指定位置
            file.transferTo(new File(baseUrl+File.separator + fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

第二种方法:

 public void upload(@RequestParam("file")MultipartFile file ){
        try {
            // 1、获取文件的原始文件名, 通过原始文件名获取文件后缀 例如:abc.jpg
            String originalFilename = file.getOriginalFilename();
            //后缀文件类型。如:.txt   .png
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            //文件前缀名称
            String prefixName = originalFilename.substring(0, originalFilename.lastIndexOf("."));
            //TODO 要上传的文件地址,应从配置文件或者数据库中读取。本地测试时可以写 :D:\\uploadFile
            String resultUrl = "";
            // 2、创建一个目录对象
            File dir = new File(resultUrl);
            //判断当前目录是否存在
            if (!dir.exists() || (!dir.isDirectory())) {
                dir.mkdirs();
            }
            //3、若文件已存在,重命名为历史文件
            File uploadFile = new File(resultUrl+ File.separator+ originalFilename);
            //数据入库
            if (uploadFile.exists()){
                String rename =  "重命名后的名称";
                File renameFile = new File(resultUrl+File.separator+prefixName+"-"+rename+suffix);
                com.google.common.io.Files.copy(uploadFile,renameFile);
            }
            // 4、将临时文件转存到指定位置
            file.transferTo(uploadFile);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

如果上述代码出现:com.google.common.io找不到

请在pom.xml文件中加入一下配置:

<dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>27.0-jre</version>
</dependency>

多个文件单个字段上传(就是多次调用单个文件上传):

    /**
     * 多个文件单个字段上传:例如:file : [logo.jpg , name.txt]
     * @param files
     * @param baseUrl
     */
    public static void uploadFiles(MultipartFile[] files,String baseUrl,String uploadName){
        for (MultipartFile file : files) {
            upload(file,baseUrl,uploadName);
        }
    }

 多个文件多个字段上传:

在apifox中测试应该为:

 /**
     * 多个文件多字段上传。例如: file1:logo.png , file2:name.txt
     * @param request
     */
    public static void uploadFiles(MultipartHttpServletRequest request){
       CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
       if (multipartResolver.isMultipart(request)){
           //上传多个文件,每个字段一个文件
           Iterator<String> fileNames = request.getFileNames();
           while (fileNames.hasNext()){
               //取得上传的文件
               String uploadName = fileNames.next();
               MultipartFile file = request.getFile(uploadName);
               if (file != null){
                   String projectPath = request.getSession().getServletContext().getRealPath("/");
                   String originalFilename = file.getOriginalFilename();
                   String temFile = projectPath + System.currentTimeMillis() + "_" + originalFilename;
                   File targetFile = new File(temFile);
                   try {
                       file.transferTo(targetFile);
                   }catch (IOException e){
                       e.printStackTrace();
                   }
               }
           }
       }
    }

注意:

在调用多个文件多个字段的方法时如果出现java.lang.ClassNotFoundException: org.apache.commons.fileupload.disk.DiskFileItemFactory的解决方法:

 如果出现以上错误,请在pom.xml中引入

<dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.2.1</version>
</dependency>

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值