16.1文件上传
多数文件上传是通过表单形式提交给后台服务器的
要实现文件上传功能,需要提供一个文件上传的表单,表单必须满足以下3个条件:
(1)form表单的method属性设置为post
(2)form表单的enctype属性设置为multipart/form-data
(3)提供<input type="file" name="filename" />
的文件上传输入框
文件上传表单示例代码如下:
<form action="uploadUrl" method="post" enctype="multipart/from-data">
<input type="file" name="filename" multiple="multiple">
<input type="submit" value="文件上传" />
</form>
<input>
元素中的multipe属性: 是HTML中的新属性,如果使用该属性,则可以同时选择多个文件进行上传上传
当客户端from表单的enctype属性为multipart/from-data时,浏览器会采用二进制的方式来处理表单数据,服务器端会对文件上传的请求进行解析处理
Spring MVC为文件上传提供了直接的支持,这种支持是通过MultipartResolver(多部件解析器)对象实现的
MultipartResolver(多部件解析器):是一个接口对象,需要通过它的实现类CommonsMultipartResolver来完成文件上传工作。其具体配置方式如下:
<bean id="multipartResolver" class=
"org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置请求编码格式,必须与JSP中的pageEncoding属性一致,默认为ISO-8859-1-->
<property name="defaultEncoding" value="UTF-8" />
<!-- 设置允许上传文件的最大值(2MB),单位为字节-->
<property name="maxUploadSize" value="2097152" />
...
</bean>
通过<property>
元素可以对文件解析器类CommonsMultipartResolver的如下属性进行配置:
(1)maxUploadSize:上传文件最大长度(以字节为单位)
(2)maxInMemorySize:缓存中的最大尺寸
(3)defaultEncoding:默认编码格式
(4)resolveLazily:推迟文件解析,以便在Controller中捕获文件大小异常
注意:因为MultipartResolver接口的实现类CommonsMultipartResolver内部是引用MultipartResolver字符传获取该实现类对象并完成文件解析的,所有在配置CommonsMultipartResolver时必须指定该Bean的id为MultipartResolver
MultipartFile接口类型的参数file:上传到程序中的文件就是被封装在该参数中的
MultipartFile接口:提供了获取上传文件,文件名称等方法;这些方法及其说明如下:
方法 | 说明 |
---|---|
byte[] getBytes() | 以字节数组的形式返回文件的内容 |
Sting getContentType() | 返回文件的内容类型 |
InputStream getInputStream() | 读取文件内容,返回一个inputStream流 |
String getName() | 获取多部件form表单的参数名称 |
String getOriginalFilename() | 获取上传文件的初始化名 |
long getSize() | 获取上传文件的大小,单位是字节 |
boolean isEmpty() | 判断上传的文件是否为空 |
void transferTo(File file) | 将上传文件保存到目标目录下 |
16.2文件下载
文件下载:将文件服务器重的文件下载到本机上
在Spring MVC环境中,实现文件下载大致可分为两个步骤:
(1)在客户端页面使用一个文件下载的超链接,该链接的href属性要指定后台文件下载的方法以及文件名(需要先在文件下载目录中添加了一个名称为“1.jpg”的文件),具体代码示例如下:
<a href="${pageContext.request.contextPath }/download?filename=1.jpg">
文件下载
</a>
(2)在后台Controller类中,使用Spring MVC提供的文件下载方法进行文件下载。Spring MVC提供了一个ResponseEntity类型的对象,使用它可以很方便地定义返回的HttpHeaders对象和HttpStatus对象,通过对这两个对象的设置,即可完成下载文件时所需的配置信息。文件下载的示例代码如下:
@RequestMapping("/download")
public ResponseEntity<byte[]> fileDownload(HttpServletRequest request,
String filename) throws Exception{
// 指定要下载的文件所在路径
String path = request.getServletContext().getRealPath("/upload/");
// 创建该文件的对象
File file = new File(path+File.separator+filename);
// 设置响应头
HttpHeaders headers = new HttpHeaders();
// 通知浏览器以下载的方式打开文件
headers.setContentDispositionFormData("attachment", filename);
//定义以流的形式下载返回文件数据
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
// 使用Sring MVC框架的ResponseEntity对象封装返回下载数据
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
headers,HttpStatus.OK);
}
ResponseEntity对象:用于直接返回结果对象
设置响应头信息中的MediaType:代表是Interner Media Type(即互联网媒体类型),也叫做MIME类型
APPLICATION_OCTET_STREAM:表示以二进制流的形式下载数据;
HttpStatus:表示200,即服务器已经成功处理了请求
解决浏览器中文件下载时的中文乱码问题:可以在前端页面发送请求前对中文名进行统一编码,然后再后要控制器类中对文件名称进行相应的转码