SpringMVC文件上传与下载
1 文件上传
表单上传文件 前端要求:
- 请求方式必须是post
- 请求类型必须是multipart/form-data(enctype必须为multipart/form-data(二进制流的形式提交))
1.1 导入文件上传依赖
- 文件操作依赖
commons-io
- 文件上传的依赖
fileupload
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
1.2 文件上传表单
upload.html
请求方式必须是post
请求的类型必须是multipart/form-data
enctype必须为multipart/form-data(二进制流的形式提交)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
名称:<input type="text" name="name">
头像:<input type="file" name="file">
<input type="submit" value="上传">
</form>
</body>
</html>
1.3 配置文件上传解析器
springmvc.xml
- 文件上传解析器
CommonsMultipartResolver
- 设置最大上传的总大小
- 设置单个文件上传的大小
- 设置文件上传编码格式
<!-- 文件上传解析器 CommonsMultipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--最大上传的总大小-->
<property name="maxUploadSize" value="10000000"></property>
<!--单个文件上传的大小-->
<property name="maxUploadSizePerFile" value="2000000"></property>
<!--文件上传编码格式-->
<property name="defaultEncoding" value="utf-8"></property>
</bean>
1.4 定义Controller
- 处理文件上传的内容
- 获取上传文件的名称–获取文件的后缀–获取新文件名称
- 将上传的文件保存到指定的位置
- 成功跳转
@Controller
public class UploadController {
@RequestMapping("/uploadFile")
public String upload(MultipartFile file,String name){
//文件上传的操作
//1、定义文件的位置(a、当前项目 b、本地磁盘)
//2、解决文件名冲突问题
//--------------------------------------------------
//获取上传的文件名
String filename = file.getOriginalFilename();
//FilenameUtils.getExtension(filename); 获取文件后缀名 (注意:没有.)
String fileNameExt = filename.substring(filename.lastIndexOf("."));
filename = UUID.randomUUID().toString().replace("-","")+fileNameExt;
File f = new File("D:\\workspace\\upload",filename);
try {
//将上传文件保存指定位置
file.transferTo(f);
} catch (IOException e) {
e.printStackTrace();
}
return "ok";
}
}
2 文件下载
2.1 定义下载链接
前端页面定义下载链接
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<img src="/img/e791dfcb84bf4708aa5985190d23c0e9.jpg" width="120px" height="120px"><br>
<a href="/download?name=e791dfcb84bf4708aa5985190d23c0e9.jpg">点击下载</a>
</body>
</html>
2.2 定义Controller
- java注释中不能出现单斜杠(错误,非法的Unicode转义)
- 根据文件名创建输入流对象
- 读取磁盘文件,通过响应流写到客户端
- 设置响应头,告知浏览器是下载操作 attachment以附件形式响应
- 拷贝方法。将文件读取出来, 通过响应流写客户端
向浏览器返回输出流
@Controller
public class DownloadController {
@RequestMapping("/download")
public void download(String name, HttpServletResponse response) throws IOException {
//根据文件名创建输入流对象 name是前端拿到的
//读取D:\\workspace\\upload\\name文件,通过响应流写到客户端 \n \t
FileInputStream fis = new FileInputStream("D:\\workspace\\upload\\"+name);
//设置响应头,告知浏览器是下载操作 attachment以附件形式响应
response.setHeader("Content-Disposition","attachment;filename="+name);
//拷贝方法。将文件读取出来, 通过响应流写客户端 (向浏览器返回输出流)
IOUtils.copy(fis,response.getOutputStream());
}
}