文件下载
使用ResponseEntity实现下载文件的功能
关键点:返回响应报文
对象
- 通过HttpSession获取application对象
- 然后通过application动态获取资源在服务器的路径
- 创建输入流读取资源文件,存储在字节数组中
- 创建响应头对象,设置文件下载的响应头
- 创建响应状态码对象设置响应状态码
- 创建ResponseEntity对象 放入 请求体 请求头 请求状态码 参数
- 关闭
流
资源 - 返回请求报文对象
@RequestMapping("/testDown")
//ResponseEntity作为方法的返回值,代表响应给浏览器的返回值!
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
//获取ServletContext对象
ServletContext servletContext = session.getServletContext();
//获取服务器中文件的真实路径
String realPath = servletContext.getRealPath("/static/img/python.png");
System.out.println(realPath);
//创建输入流
InputStream is = new FileInputStream(realPath);
//创建字节数组
byte[] bytes = new byte[is.available()];//响应体
//将流读到字节数组中
is.read(bytes);
//创建HttpHeaders对象设置响应头信息
MultiValueMap<String, String> headers = new HttpHeaders();
//设置要下载方式以及下载文件的名字
headers.add("Content-Disposition", "attachment;filename=1.png");//响应头 filename是下载文件默认的名字
//设置响应状态码
HttpStatus statusCode = HttpStatus.OK;
//创建ResponseEntity对象
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);//通过响应体,响应头,响应状态码创建响应报文信息
//关闭输入流
is.close();
return responseEntity;
}
文件上传 enctype="multipart/form-data"
文件上传要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data"
SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息
关键步骤:转移资源到服务器
- 添加文件上传依赖
- 添加SpringMVC文件上传配置解析器
- 通过
MultipartFile
接收上传的文件 - 处理文件命名重复的问题
- 创建/获取文件存放目录路径和文件名称拼接得到文件在服务器的位置
- 将上传的资源转移到
指定服务器目录
photo.transferTo(new File(finalPath));
1. 添加依赖:
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
2. 在SpringMVC的配置文件中添加配置:
<!--必须通过文件解析器的解析才能将文件转换为MultipartFile对象-->
<!--文件上传解析器-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="104857600"/>
</bean>
3. 控制器方法:
@RequestMapping("/testUp")
public String testUp(MultipartFile photo, HttpSession session) throws IOException {
//获取上传的文件的文件名
String fileName = photo.getOriginalFilename();
//处理文件重名问题
String hzName = fileName.substring(fileName.lastIndexOf("."));
fileName = UUID.randomUUID().toString() + hzName;
//获取服务器中photo目录的路径
ServletContext servletContext = session.getServletContext();
String photoPath = servletContext.getRealPath("photo");
File file = new File(photoPath);
if(!file.exists()){
file.mkdir();
}
String finalPath = photoPath + File.separator + fileName;
//实现上传功能
photo.transferTo(new File(finalPath));
return "success";
}
Content-Disposition是什么?
Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。
当 IE 浏览器接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。
Content-Disposition 就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。
enctype就是encodetype就是编码类型的意思 二进制传输?
multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。
需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。
application/x-www-form-urlencoded不是不能上传文件,是只能上传文本格式的文件,multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传。