SpringMVC 05 -文件上传与下载
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 \\tFileInputStream fis = new FileInputStream("D:\\\\workspace\\\\upload\\\\"+name);//设置响应头,告知浏览器是下载操作 attachment以附件形式响应response.setHeader("Content-Disposition","attachment;filename="+name);//拷贝方法。将文件读取出来, 通过响应流写客户端 (向浏览器返回输出流)IOUtils.copy(fis,response.getOutputStream());}
}