【Java 中级】一文精通 Spring MVC - 上传(十)

这篇具有很好参考价值的文章主要介绍了【Java 中级】一文精通 Spring MVC - 上传(十)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Java 中级】一文精通 Spring MVC - 上传(十),Java 中级,java,spring,mvc

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主

⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 高阶
🙉八股文专题:剑指大厂,手撕 Java 八股文

1. 什么是 MultipartResolver

MultipartResolver 是 Spring 框架提供的一个接口,用于处理 HTTP 请求中的多部分(multipart)数据,通常用于上传文件等场景。

当客户端发送包含文件上传或其他二进制数据的请求时,请求的内容类型为 multipart/form-data。MultipartResolver 的作用就是解析这种类型的请求,提取其中的各个部分数据。

Spring 框架提供了多种 MultipartResolver 的实现,常用的有以下几种:

  1. CommonsMultipartResolver:基于 Apache Commons FileUpload 库实现的 MultipartResolver。需要在项目中添加 commons-fileupload 依赖。
  2. StandardServletMultipartResolver:基于 Servlet 3.0+ 的标准 API 实现的 MultipartResolver。不需要额外的依赖,适用于运行在 Servlet 3.0+ 容器中的项目。
  3. CosMultipartResolver:基于 COS(Chinese Open Source)库实现的 MultipartResolver。需要在项目中添加 cos.jar 依赖。

使用 MultipartResolver 需要在 Spring 配置文件中进行相应的配置。例如,在使用 CommonsMultipartResolver 的情况下,可以进行如下配置:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 设置上传文件的最大大小 -->
    <property name="maxUploadSize" value="5242880" />
</bean>

yml 配置如下:

spring:
  servlet:
    multipart:
      max-file-size: 5MB
      max-request-size: 5MB

在配置中,我们可以设置最大上传文件大小等参数。

一旦配置完成,Spring MVC 将会自动使用 MultipartResolver 来解析 multipart 请求,并将上传的文件或其他数据绑定到相应的方法参数中。

2. 实现单文件上传

我们以Spring Boot和Vue项目为背景,实现单文件上传可以按照以下步骤进行:

  1. 配置MultipartResolver:
    在Spring Boot中,MultipartResolver的配置可以通过application.properties或application.yml文件进行。在application.yml文件中添加以下配置:
spring:
  servlet:
    multipart:
      max-file-size: 5MB
      max-request-size: 5MB

上述配置将设置最大上传文件大小为5MB。

  1. 创建文件上传接口:
    在Spring Boot的Controller中创建一个接口来处理文件上传请求。
@RestController
public class FileUploadController {
    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        // 检查上传的文件是否为空
        if (file.isEmpty()) {
            // 处理文件为空的情况
        }

        try {
            // 获取上传文件的字节数据
            byte[] bytes = file.getBytes();
            // 执行文件存储或其他操作
            // ...
            return "上传成功";
        } catch (IOException e) {
            // 处理文件读取错误的情况
        }

        return "上传失败";
    }
}

uploadFile 方法使用 @RequestParam 注解来接收名为 file 的文件参数,并使用 MultipartFile 类型来表示上传的文件。可以根据实际需求进行文件存储或其他操作。

  1. 创建Vue页面进行文件上传:
    在Vue项目中,可以使用 <input type="file"> 标签来创建文件上传的表单。在表单提交时,使用axios或其他HTTP库将文件发送到后端接口。
<template>
  <div>
    <input type="file" @change="handleFileUpload">
    <button @click="uploadFile">上传</button>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      file: null
    };
  },
  methods: {
    handleFileUpload(event) {
      this.file = event.target.files[0];
    },
    uploadFile() {
      let formData = new FormData();
      formData.append('file', this.file);

      axios.post('/upload', formData)
        .then(response => {
          console.log(response.data);
          // 处理上传成功的响应
        })
        .catch(error => {
          console.error(error);
          // 处理上传失败的响应
        });
    }
  }
};
</script>

通过 <input type="file"> 标签和 @change 事件来监听文件选择,并将选择的文件保存在Vue组件的data中。在点击"上传"按钮时,使用axios库将文件发送到后端的 /upload 接口。

3. 实现多文件上传

以Spring Boot和Vue项目背景下,实现多文件上传可以按照以下步骤进行:

  1. 配置MultipartResolver:
    在Spring Boot中,MultipartResolver的配置可以通过application.properties或application.yml文件进行。在application.yml文件中添加以下配置:
spring:
  servlet:
    multipart:
      max-file-size: 5MB
      max-request-size: 5MB

上述配置将设置最大上传文件大小为5MB。

  1. 创建文件上传接口:
    在Spring Boot的Controller中创建一个接口来处理文件上传请求。
@RestController
public class FileUploadController {
    @PostMapping("/upload")
    public String uploadFiles(@RequestParam("files") MultipartFile[] files) {
        // 检查上传的文件是否为空
        if (files == null || files.length == 0) {
            // 处理文件为空的情况
        }

        for (MultipartFile file : files) {
            try {
                // 获取上传文件的字节数据
                byte[] bytes = file.getBytes();
                // 执行文件存储或其他操作
                // ...
            } catch (IOException e) {
                // 处理文件读取错误的情况
            }
        }

        return "上传成功";
    }
}

uploadFiles 方法使用 @RequestParam 注解来接收名为 files 的文件数组参数,并使用 MultipartFile[] 类型来表示上传的多个文件。可以根据实际需求进行文件存储或其他操作。

  1. 创建Vue页面进行多文件上传:
    在Vue项目中,可以使用 <input type="file" multiple> 标签来创建多文件上传的表单。在表单提交时,使用axios或其他HTTP库将文件发送到后端接口。
<template>
  <div>
    <input type="file" multiple @change="handleFileUpload">
    <button @click="uploadFiles">上传</button>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      files: []
    };
  },
  methods: {
    handleFileUpload(event) {
      this.files = Array.from(event.target.files);
    },
    uploadFiles() {
      let formData = new FormData();
      this.files.forEach(file => {
        formData.append('files', file);
      });

      axios.post('/upload', formData)
        .then(response => {
          console.log(response.data);
          // 处理上传成功的响应
        })
        .catch(error => {
          console.error(error);
          // 处理上传失败的响应
        });
    }
  }
};
</script>

通过 <input type="file" multiple> 标签和 @change 事件来监听文件选择,并将选择的文件保存在Vue组件的data中的一个数组中。在点击"上传"按钮时,使用axios库将文件发送到后端的 /upload 接口。

4. 多文件多线程上传

在Spring Boot和Vue项目背景下实现多文件多线程上传可以按照以下步骤进行:

  1. 配置MultipartResolver:
    在Spring Boot中,MultipartResolver的配置可以通过application.properties或application.yml文件进行。在application.yml文件中添加以下配置:
spring:
  servlet:
    multipart:
      max-file-size: 5MB
      max-request-size: 5MB

上述配置将设置最大上传文件大小为5MB。

  1. 创建文件上传接口:
    在Spring Boot的Controller中创建一个接口来处理文件上传请求。
@RestController
public class FileUploadController {
	public static final ExecutorService EXECUTOR_SERVICE= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
	
    @PostMapping("/upload")
    public String uploadFiles(@RequestParam("files") MultipartFile[] files) {
        // 检查上传的文件是否为空
        if (files == null || files.length == 0) {
            // 处理文件为空的情况
        }

        // 使用多线程进行文件上传
        for (MultipartFile file : files) {
            EXECUTOR_SERVICE.execute(() -> {
                try {
                    // 获取上传文件的字节数据
                    byte[] bytes = file.getBytes();
                    // 执行文件存储或其他操作
                    // ...
                } catch (IOException e) {
                    // 处理文件读取错误的情况
                }
            });
        }

        return "上传成功";
    }
}

uploadFiles 方法使用 @RequestParam 注解来接收名为 files 的文件数组参数,并使用 MultipartFile[] 类型来表示上传的多个文件。在方法内部,我们创建了一个线程池(使用 Executors.newFixedThreadPool ),并使用多线程来处理文件上传操作。可以根据实际需求进行文件存储或其他操作。

  1. 创建Vue页面进行多文件上传:
    在Vue项目中,可以使用 <input type="file" multiple> 标签来创建多文件上传的表单。在表单提交时,使用axios或其他HTTP库将文件发送到后端接口。
<template>
  <div>
    <input type="file" multiple @change="handleFileUpload">
    <button @click="uploadFiles">上传</button>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      files: []
    };
  },
  methods: {
    handleFileUpload(event) {
      this.files = Array.from(event.target.files);
    },
    uploadFiles() {
      let formData = new FormData();
      this.files.forEach(file => {
        formData.append('files', file);
      });

      axios.post('/upload', formData)
        .then(response => {
          console.log(response.data);
          // 处理上传成功的响应
        })
        .catch(error => {
          console.error(error);
          // 处理上传失败的响应
        });
    }
  }
};
</script>

上述示例中,通过 <input type="file" multiple> 标签和 @change 事件来监听文件选择,并将选择的文件保存在Vue组件的data中的一个数组中。在点击"上传"按钮时,使用axios库将文件发送到后端的 /upload 接口。

5. 大文件分段上传

在Spring Boot和Vue项目背景下实现大文件分段上传可以按照以下步骤进行:

  1. 配置MultipartResolver:
    在Spring Boot中,MultipartResolver的配置可以通过application.properties或application.yml文件进行。在application.yml文件中添加以下配置:
spring:
  servlet:
    multipart:
      max-file-size: 5MB
      max-request-size: 5MB

上述配置将设置最大上传文件大小为5MB。

  1. 创建文件上传接口:
    在Spring Boot的Controller中创建一个接口来处理文件分段上传请求。
@RestController
public class FileUploadController {
    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file,
                             @RequestParam("chunkNumber") int chunkNumber,
                             @RequestParam("totalChunks") int totalChunks) {
        // 检查上传的文件是否为空
        if (file.isEmpty()) {
            // 处理文件为空的情况
        }

        try {
            // 获取上传文件的字节数据
            byte[] bytes = file.getBytes();
            
            // 执行文件存储或其他操作
            // ...
            
            // 判断是否为最后一个分片
            if (chunkNumber == totalChunks) {
                // 所有分片上传完成,进行合并操作
                // ...
            }

            return "上传成功";
        } catch (IOException e) {
            // 处理文件读取错误的情况
        }

        return "上传失败";
    }
}

uploadFile 方法使用 @RequestParam 注解来接收文件参数、分片序号和总分片数。可以根据实际需求进行文件存储或其他操作。在最后一个分片上传完成后,可以进行文件合并操作。

  1. 创建Vue页面进行大文件分段上传:
    在Vue项目中,可以使用 <input type="file"> 标签来创建文件选择的表单。在选择文件后,使用axios或其他HTTP库将文件分段发送到后端接口。
<template>
  <div>
    <input type="file" @change="handleFileUpload">
    <button @click="uploadFile">上传</button>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      file: null
    };
  },
  methods: {
    handleFileUpload(event) {
      this.file = event.target.files[0];
    },
    uploadFile() {
      let chunkSize = 1024 * 1024; // 每个分片的大小,这里设置为1MB
      let totalChunks = Math.ceil(this.file.size / chunkSize); // 总分片数
      let start = 0;

      for (let chunkNumber = 1; chunkNumber <= totalChunks; chunkNumber++) {
        let end = Math.min(start + chunkSize, this.file.size);
        let chunk = this.file.slice(start, end);

        let formData = new FormData();
        formData.append('file', chunk);
        formData.append('chunkNumber', chunkNumber);
        formData.append('totalChunks', totalChunks);

        axios.post('/upload', formData)
          .then(response => {
            console.log(response.data);
            // 处理上传成功的响应
          })
          .catch(error => {
            console.error(error);
            // 处理上传失败的响应
          });

        start += chunkSize;
      }
    }
  }
};
</script>

我们将文件分成多个分片进行上传。在每个分片上传时,我们使用axios库将分片数据和相关参数发送到后端的 /upload 接口。

精彩专栏推荐订阅:在下方专栏👇🏻
✅ 2023年华为OD机试真题(A卷&B卷)+ 面试指导
✅ 精选100套 Java 项目案例
✅ 面试需要避开的坑(活动)
✅ 你找不到的核心代码
✅ 带你手撕 Spring
✅ Java 初阶

【Java 中级】一文精通 Spring MVC - 上传(十),Java 中级,java,spring,mvc文章来源地址https://www.toymoban.com/news/detail-677646.html

到了这里,关于【Java 中级】一文精通 Spring MVC - 上传(十)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java EE】关于Spring MVC 响应

    在博主前面写的博客 【Java EE】Spring请求如何传递参数详解 中我们已经设置了响应数据,Http响应结果可以是数据,也可以是静态⻚⾯,也可以针对响应设置状态码, Header信息等 首先我们像创建一个静态界面,创建位置如下: 前端代码如下: 不过这里的后端的代码和以前的代码

    2024年04月14日
    浏览(46)
  • Java配置方式使用Spring MVC:实战练习

    承接上文《Java配置方式使用Spring MVC》 登录页面 - login.jsp 注:这个页面没有JSP代码,其实可以做成静态页面 - login.html 登录成功页面 - success.jsp(必须是动态页面,因为要获取会话对象中的数据) 如果不用JSP的标签库,要获取会话中的数据,要复杂一点 登录失败页面 - failu

    2024年02月05日
    浏览(55)
  • java spring MVC之RESTful快速开发

    我这里有个一springboot项目 我在启动类同目录下创建了一个目录 目录名叫 controller 里面有一个UserController diam结构是这样的 这是一个基础的REST风格风格开发 但其实 我们可以很大程度的简化 这里 我先启动项目 然后用Postman测试 这些都是可以正常访问 和 调用返回的 确认无误之

    2024年02月05日
    浏览(41)
  • 【Java EE】初识Spring Web MVC

    Spring Web MVC 是 基于 Servlet API 构建的原始 Web 框架 ,从⼀开始就包含在Spring框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为)Spring MVC). Servlet是⼀种实现动态⻚⾯的技术.准确来讲Servlet是⼀套Java Web 开发的规范,或者说是⼀套Java Web 开发的

    2024年04月10日
    浏览(55)
  • 一文学会 Spring MVC 表单标签

    ✅作者简介:2022年 博客新星 第八 。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:SSM 框架从入门到精通 ✨特色专栏:国学周更-心性养成之路 🥭本文内容:一文学会 Spring

    2024年02月02日
    浏览(41)
  • Spring MVC 文件上传

    编写controller 在index.jsp里面定义超链接

    2024年02月02日
    浏览(41)
  • Spring MVC文件上传

    Spring MVC 框架的文件上传基于 commons-fileupload 组件,并在该组件上做了进一步的封装,简化了文件上传的代码实现,取消了不同上传组件上的编程差异。 在 Spring MVC 中实现文件上传十分容易,它为文件上传提供了直接支持,即 MultpartiResolver 接口 MultipartResolver 用于处理上传请求

    2024年02月15日
    浏览(47)
  • 一文让你轻松拿捏 Spring MVC

    博主介绍 : ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌ Java知识图谱点击链接: 体系化学习Java(Java面试专题) 💕💕 感兴趣的同学可以收藏关注下 , 不然下次找不到哟 💕💕 MVC是一种软件架构模式,它将应用程序分为三个主要组

    2024年02月08日
    浏览(75)
  • Java EE 突击 11 - Spring MVC 程序开发 (2)

    这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架 JavaEE 进阶专栏 Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在 接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点 并且带领大家进行环境的配置 , 让大家真正用好

    2024年02月13日
    浏览(69)
  • Java EE 突击 10 - Spring MVC 程序开发 (1)

    这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架 JavaEE 进阶专栏 Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在 接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点 并且带领大家进行环境的配置 , 让大家真正用好

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包