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

单个文件上传

第一种方法:

/**
     * 
     * @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>

实现多文件上传的方式有很多种,下面我将介绍一种基于 Vue 和 Spring Boot 的实现方式,使用的是 Element UI 的上传组件 el-upload。 前端实现: 1. 在 Vue 组件中引入 Element UI 的 el-upload 组件。 ```vue <template> <el-upload class="upload-demo" action="/api/upload" :multiple="true" :on-change="handleUploadChange" :on-remove="handleUploadRemove" :file-list="fileList"> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </el-upload> </template> ``` 2. 在 Vue 组件中定义 fileList 数组,用于存储上传的文件列表。 ```vue <script> export default { data() { return { fileList: [] } }, methods: { handleUploadChange(file, fileList) { this.fileList = fileList }, handleUploadRemove(file, fileList) { this.fileList = fileList } } } </script> ``` 3. 在 Vue 组件中定义 handleUploadChange 和 handleUploadRemove 方法,用于监听上传文件的变化和删除文件的操作,更新 fileList 数组。 后端实现: 1. 在 Spring Boot 项目中定义上传文件的接口。 ```java @RestController @RequestMapping("/api") public class FileUploadController { @PostMapping("/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile[] files) { // TODO: 处理上传的文件 return ResponseEntity.ok("上传成功"); } } ``` 2. 在接口中使用 @RequestParam 注解接收上传的文件,可以使用 MultipartFile 类型的数组来接收多个文件。接收到文件后,可以根据需要进行处理,例如保存到本地磁盘或上传到云存储服务。 3. 在 application.properties 文件中配置文件上传的相关参数。 ```properties # 文件上传配置 spring.servlet.multipart.max-file-size=500KB spring.servlet.multipart.max-request-size=100MB spring.servlet.multipart.enabled=true ``` 其中,max-file-size 和 max-request-size 分别设置了单个文件和总文件大小的最大值,enabled 表示是否启用文件上传功能。 以上就是基于 Vue 和 Spring Boot 的多文件上传实现方式,希望能对你有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值