目录
- 配置
- web.xml
- SpringMVC配置文件 applicationContext.xml
- 文件上传 Controller
- 上传实现一
- 上传实现二
- 测试
- 依赖
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <!--注册DispatcherServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
SpringMVC配置文件 applicationContext.xml
上传文件的核心配置类:CommonsMultipartResolver,注意id="multipartResolver"不要写错
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置自动扫描controller包--> <context:component-scan base-package="com.pro.controller"/> <!--配置静态资源过滤--> <mvc:default-servlet-handler/> <!--配置注解驱动--> <mvc:annotation-driven/> <!--配置视图解析器--> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean> <!--SpringMVC文件上传配置--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--设置请求的编码格式, 必须和pageEncoding的属性一致, 以便正确读取表单的值, 默认为ISO-8859-1--> <property name="defaultEncoding" value="utf-8"/> <!--上传文件的大小限制, 单位为字节 (10485760 = 10M)--> <property name="maxUploadSize" value="10485760"/> <property name="maxInMemorySize" value="40960"/> </bean> </beans>
上传实现一
package com.pro.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.commons.CommonsMultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; @RestController public class FileController { /* * 采用file.transferTo 来保存上传的文件 */ @RequestMapping("/upload2") public Map fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException { //上传路径保存设置 String path = request.getServletContext().getRealPath("/upload"); File realPath = new File(path); if (!realPath.exists()){ realPath.mkdir(); } //上传文件地址 System.out.println("上传文件保存地址 --> "+realPath); //通过CommonsMultipartFile的方法直接写文件(注意这个时候) file.transferTo(new File(realPath +"/"+ file.getOriginalFilename())); Map<Object, Object> hashMap = new HashMap<>(); hashMap.put("code", 0); hashMap.put("msg", "上传成功"); return hashMap; } }
上传实现二
这里的文件名称没有使用 UUID组合名称 为了方便测试
package com.pro.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.commons.CommonsMultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; @RestController public class FileController { // @RequestParam("file") 将 name=file 控件得到的文件封装成 CommonsMultipartFile 对象 // 批量上传把 CommonsMultipartFile 改为数组即可 @RequestMapping("/upload") public String upload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException { // 获取文件名称 String uploadFileName = file.getOriginalFilename(); // 如果文件名为空, 直接返回首页 if ("".equals(uploadFileName)) { return "file upload error"; } System.out.println("上传文件名 --> " + uploadFileName); // 设置文件的保存位置 String path = request.getServletContext().getRealPath("/upload"); // 判断路径是否存在 File realPath = new File(path); if (!realPath.exists()) { // 如果不存在就创建 realPath.mkdir(); } System.out.println("文件保存路径 --> " + realPath); // 获取文件输入流 InputStream is = file.getInputStream(); // 获取文件输出流 FileOutputStream os = new FileOutputStream(new File(realPath, uploadFileName)); // 缓冲区读写文件 byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); os.flush(); } // 关闭流 os.close(); is.close(); return "file upload success"; } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <form enctype="multipart/form-data" action="${pageContext.request.contextPath}/upload2" method="post"> <input type="file" name="file"> <input type="submit" value="上传实现一"> </form> <form enctype="multipart/form-data" action="${pageContext.request.contextPath}/upload" method="post"> <input type="file" name="file"> <input type="submit" value="上传实现二"> </form> </body> </html>
核心依赖就是 commons-fileupload
<!--导入依赖--> <dependencies> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> </dependency> <!--spring--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.0.RELEASE</version> </dependency> <!--文件上传--> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> <!--servlet-api导入高版本的--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <!--jsp--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <!--jstl表达式--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies>