一:单文件上传
因为spring mvc的上传,底层还是依赖commons-io.jar,commons-upload.jar,所以使用之前先引入pom依赖
1、pom依赖
<!--引入上传组件-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
2、页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/upload/upload" method="post" enctype="multipart/form-data">
上传文件: <input type="file" name="img">
<input type="submit" value="提交">
</form>
<img src="${img}"/>
</body>
</html>
注意点:
- 请求方式必须是post,enctype必须等于multipart/form-data(get 请求或者不设置enctype只能将文件名传给服务器)
- ,type必须file,而且name属性值,要和Multipart xxx的形参名一致!
- 要想在页面中使用EL,加上isELIgnored=“false” 指令!
- 因为该页面存在一个图片,请求该页面的时候,该页面也会发送一个请求,去请求图片,而如果不去web.xml中配置的话,spring mvc默认会将它交给DispatcherServlet来处理,通过HandlerMapping
去获取Handler,因为不存在该Handler的映射,所以到时候会报错!!,所以对图片这个静态资源需要在
web.xml中配置一下
web.xml
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
3、Handler
@Controller
@RequestMapping("/upload")
public class UploadController {
@PostMapping("/upload")
public String upload(MultipartFile img, HttpServletRequest reqeust){
if(img.getSize()>0){
//1.获取保存上传文件的路径!
String path = reqeust.getSession().getServletContext().getRealPath("upload");
//2.获取上传的文件名
String fileName = img.getOriginalFilename();
File file = new File(path,fileName);
try {
img.transferTo(file);
/*存到request域,在upload.jsp中显示出来!*/
reqeust.setAttribute("img","/upload/"+fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
return "upload";
}
}
注意点:
获取的upload文件夹必须存在:F:\Software\tomcat\apache-tomcat-8.5.39\webapps\ROOT\upload
它是在ROOT目录下创建的,并且tomcat每次启动完,我们手动创建的upload文件夹就会消失,所以每次都得手动创建一个
注:到Handler后还不行,还得在配置文件中配置CommonsMultipartResolver才行!
4、spring mvc.xml
<!-- 配置上传组件 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
二:多文件上传
跟单文件上传差不多
1、页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/upload/uploads" method="post" enctype="multipart/form-data">
文件1: <input type="file" name="imgs"><br/>
文件2: <input type="file" name="imgs"><br/>
文件3: <input type="file" name="imgs"><br/>
<input type="submit" value="提交">
</form>
<c:forEach items="${files}" var="file">
<img src="${file}" width="300px">
</c:forEach>
</body>
</html>
1.由于使用了jstl需要导入pom依赖
2.注意name属性值必须和形参名字一模一样!
jstl
<!--引入jstl-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
2、Handler
@PostMapping("/uploads")
public String uploads(MultipartFile[] imgs, HttpServletRequest request){
List<String> files = new ArrayList<>();
for(MultipartFile img : imgs){
if(img.getSize()>0){
//1.获取存放上传文件的路径
String path = request.getSession().getServletContext().getRealPath("upload");
String name = img.getOriginalFilename();
File destfile = new File(path,name);
try {
img.transferTo(destfile);
files.add("/upload/"+name);
} catch (IOException e) {
e.printStackTrace();
}
}
}
request.setAttribute("files",files);
return "uploads";
}
三:文件下载
1、页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/file/download/1">1.png</a>
<a href="/file/download/2">2.png</a>
<a href="/file/download/3">3.png</a>
</body>
</html>
2、Handler
@Controller
@RequestMapping("/file")
public class DownloadController {
@GetMapping("/download/{name}")
public void download(@PathVariable("name") String name, HttpServletRequest reqeust, HttpServletResponse response){
if(name != null) {
name += ".png";
String path = reqeust.getSession().getServletContext().getRealPath("upload");
File file = new File(path, name);
OutputStream outputStream = null;
if (file.exists()) {
response.setContentType("application/forc-download");
response.setHeader("Content-Disposition","attachment;filename="+name);
try {
outputStream = response.getOutputStream();
//将文件转换成字节数组!
outputStream.write(FileUtils.readFileToByteArray(file));
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
}
注:你可以先用uploads.jsp页面上传,然后在来用download.jsp体验下载!