目录
十一、文件上传
用户通过客户端,将用户本地文件传递到服务器上,并在服务器上将用户上传的文件进行保存;
11.1、文件上传三要素
【1】请求方式必须是Post,Get请求携带的数据量受限
【2】form表单的enctype取值必须是:multipart/form-data
form默认content-type是:application/x-www-form-urlencoded
enctype:是表单请求正文的类型
multipart/form-data: 多部分表单项
作用:
1.将普通表单项与文件上传项分离,普通表单项可以直接被解析
2.而上传文件项需要对上传的文件进行解析,并保存文件
【3】提供一个文件输入框<input type="file" name="xxx"/>
<form method="post" enctype="multipart/form-data">
用户名: <input type="text" name="username"/> 【普通表单项】
密码: <input type="text" name="password" /> 【普通表单项】
头像: <input type="file" name="filename" /> 【上传文件项】
<input type="submit" value="提交表单" />
</form>
11.2、SpringMVC实现文件上传
11.2.1 导入Fileupload的jar包
<!--普通文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
11.2.2 配置到springmvc.xml文件中
<!-- 配置文件上传解析器 id为固定值,不能变-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--最大文件大小,单位字节 5m= 1024*1024*5-->
<property name="maxUploadSize" value="5000000"/>
<!--指定默认编码格式-->
<property name="defaultEncoding" value="UTF-8"/>
</bean>
11.2.3 编写前端页面(发送上传文件的请求)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<!--必须为post提交,multipart/form-data-->
<form action="/fileUpload/one" method="post" enctype="multipart/form-data">
<!--标签name与控制器参数名相同-->
用户名: <input type="text" name="name" value="tom"> <br>
年龄: <input type="text" name="age" value="18"> <br>
头像: <input type="file" name="file"> <br>
<input type="submit" value="提交表单">
</form>
<form action="/fileUpload/more" method="post" enctype="multipart/form-data">
<!--标签name与控制器参数名相同-->
用户名: <input type="text" name="name" value="碇真嗣"> <br>
年龄: <input type="text" name="age" value="14"> <br>
<%--name相同,控制器使用数组接收--%>
头像: <input type="file" name="file"> <br>
头像: <input type="file" name="file"> <br>
头像: <input type="file" name="file"> <br>
<input type="submit" value="提交表单">
</form>
</body>
</html>
11.2.4 测例
@Controller
@RequestMapping("/fileUpload")
public class FileUpload {
@RequestMapping("/one")
public String uploadOne(String name, String age, MultipartFile file) throws IOException {
System.out.println("name = " + name + ",age = " + age + ",file = " + file);
//form表单中输入项的名称(name属性对应的名称)
String inputName = file.getName();
//获取图片原始名称
String filename = file.getOriginalFilename();
//获取文件的后缀名,从。开始截取到最后
String substring = filename.substring(filename.lastIndexOf("."));
System.out.println("输入名 = " + inputName + ",原始名 = " + filename + ",后缀名 = " + substring);
//本地转存
file.transferTo(new File("C:\\Users\\14614\\Desktop\\images\\"+filename));
return "success";
}
@RequestMapping("/more")
public String uploadMore(String name, String age, MultipartFile[] file) throws IOException {
System.out.println("name = " + name + ",age = " + age + ",file = " + file);
//form表单中输入项的名称(name属性对应的名称)
for (MultipartFile mfile : file) {
String inputName = mfile.getName();
//获取图片原始名称
String filename = mfile.getOriginalFilename();
//获取文件的后缀名,从。开始截取到最后
String substring = filename.substring(filename.lastIndexOf("."));
System.out.println("输入名 = " + inputName + ",原始名 = " + filename + ",后缀名 = " + substring);
//本地转存 使用uuid代替文件名
mfile.transferTo(new File("C:\\Users\\14614\\Desktop\\images\\"+ UUID.randomUUID()+substring));
}
return "success";
}
}