ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
SpringMVC 实现文件上传的顶级接口为 MultipartResolver,它用于处理上传请求,将上传请求包装成可以直接获取文件的数据,从而方便操作。它有如下两个实现类: ```java StandardServletMultipartResolver:使用Servlet3.0标准的上传方式; CommonsMultipartResolver:使用Apache的commons-fileupload来完成; ``` [TOC] # 1. CommonsMultipartResolver 方式上传 步骤如下: **1. 引入commons-fileupload** ```xml <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency> ``` **2. 在`resources/springmvc-servlet.xml`中配置`CommonsMultipartResolver`** ```xml <!-- 配置文件上传解析器:MultipartResolver --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 所有文件大小总和的上限,默认为-1,不限制。单位byte --> <property name="maxUploadSize" value="5000000" /> <!-- 单个文件大小的上限,默认为-1,不限制。单位byte --> <property name="maxUploadSizePerFile" value="5000000" /> <!--请求的编码格式,默认ISO-8859-1。必须与jsp文件的pageEncoding编码一致,否则读取失败,如 <%@ page ... pageEncoding="UTF-8"%> --> <property name="defaultEncoding" value="UTF-8" /> </bean> ``` **3. 在controller层调用`MultipartFile`接收上传的文件** ```java @Controller public class UploadController { @ResponseBody @PostMapping("/v1/upload") public String upload(@RequestParam("file") MultipartFile[] multipartFiles, @RequestParam("detail") String detail) throws IOException { System.out.println("detail:" + detail); //detail:文件的一些信息 for (MultipartFile file : multipartFiles) { System.out.println("文件名:" + file.getOriginalFilename()); System.out.println("文件大小:" + file.getSize()); //将文件存储到服务器的磁盘中 file.transferTo(new File("e:/upload/springmvc/" + file.getOriginalFilename())); } //文件名:001.xlsx //文件大小:3414 //文件名:002.xlsx //文件大小:3483 return "上传成功"; } } ``` **4. 视图层** ```html <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <html> <head> <title>UPLOADFILE</title> </head> <body> <input type="file" id="files" multiple/> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> <script type="text/javascript"> $("#files").change(function () { //创建表单对象 const formData = new FormData() for (let i = 0; i < this.files.length; i++) { formData.append("file", this.files[i]) } formData.append("detail", "文件的一些信息") $.ajax({ url: "${ pageContext.request.contextPath }/v1/upload", type: "post", //必须是post,不能是get async: true, //true为异步,false为同步---同步和异步都可以 data: formData, processData: false, //告诉jQuery不要去处理发送的数据 contentType: false, //告诉jQuery不要去设置Content-Type请求头 beforeSend: function () { //在提交前执行的代码 }, success: function (res) { //提交后并执行成功的执行的代码 console.log(res) }, error: function () { //后端发生异常后执行的代码 } }) }) </script> </body> </html> ```