案例:文件上传
2021年2月18日大约 3 分钟约 856 字
1. 前言
文件上传的目的效果:
file.jsp
<form action="${pageContext.request.contextPath}/quick20" method="post" enctype="multipart/form-data"> 名称:<input type="text" name="name"><br> 文件:<input type="file" name="file"><br> <input type="submit" value="提交"><br> </form>
web 页面
36
文件上传客户端三要素:
- 表单项 type="file";
- 表单的提交方式是 post;
- 表单的 enctype 属性是多部分表单形式,即 enctype="multipart/form-data"。
文件上传原理:
- 当 form 表单修改为多部分表单时,request.getParameter() 等将失效;
- 当 form 表单的 enctype="application/x-www-form-urlencoded"时,form 表单的正文内容格式是:key=value&key=value&key=value;
- 当 form 表单的 enctype="Multipart/form-data"时,请求正文内容就变成多部分形式:
2. 单文件上传
导入 fileupload 和 io 坐标——pom.xml
<!-- 文件上传包 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.3</version> </dependency>
配置文件上传解析器——spring-mvc.xml
<!-- 配置文件上传解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 上传文件总大小 --> <property name="maxUploadSize" value="5242880"/> <!-- 上传单个文件的大小 --> <property name="maxUploadSizePerFile" value="1048576"/> <!-- 上传文件的编码类型 --> <property name="defaultEncoding" value="UTF-8"/> </bean>
编写文件上传代码
upload.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="${pageContext.request.contextPath}/quick12" method="post" enctype="multipart/form-data" > 名称:<input type="text" name="username" /><br /> 文件:<input type="file" name="uploadFile" /><br /> <input type="submit" value="提交" /><br /> </form> </body> </html>
UserController.java
注意参数名要和 upload.jsp 中对应的名称匹配。
@RequestMapping("/quick12") @ResponseBody public void save12(String username, MultipartFile uploadFile) throws IOException { System.out.println(username); // 获得上传的文件名称 String originalFilename = uploadFile.getOriginalFilename(); uploadFile.transferTo(new File("C:\\Users\\admin\\Desktop\\" + originalFilename)); }
结果演示
预备文件:C:\Users\admin\Desktop\xq\abc.txt
37 浏览器输入
38 控制台输出
39 服务器接收并保存的文件
40
附:本例的 web.xml 内容,注意必须把监听器部分注释掉上例才能跑通,如果取消注释会发生异常。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 配置全局过滤的 filter 来校正中文乱码 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置 SpringMVC 的前端控制器 --> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 全局初始化参数 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 配置监听器 --> <!-- <listener>--> <!-- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>--> <!-- </listener>--> <!-- <servlet>--> <!-- <servlet-name>UserServlet</servlet-name>--> <!-- <servlet-class>com.itheima.web.UserServlet</servlet-class>--> <!-- </servlet>--> <!-- <servlet-mapping>--> <!-- <servlet-name>UserServlet</servlet-name>--> <!-- <url-pattern>/userServlet</url-pattern>--> <!-- </servlet-mapping>--> </web-app>
3. 多文件上传
实现多文件上传:只需将页面修改为多个文件上传,然后把业务方法参数MultipartFile
类型修改为MultipartFile[]
即可。
<h1>多文件上传测试</h1>
<form action="${pageContext.request.contextPath}/quick21" method="post" enctype="multipart/form-data">
名称:<input type="text" name="name"><br>
文件 1:<input type="file" name="uploadFiles"><br>
文件 2:<input type="file" name="uploadFiles"><br>
文件 3:<input type="file" name="uploadFiles"><br>
<input type="submit" value="提交"><br>
</form>
@RequestMapping("/quick21")
@ResponseBody
public void quickMethod21(String username, MultipartFile[] uploadFiles) throws IOException {
for (MultipartFile uploadFile : uploadFiles) {
String originalFilename = uploadFile.getOriginalFilename();
uploadFile.transferTo(new File("C:\\upload\\" + originalFilename));
}
}