Java EE之第16章文件上传和下载

第16章文件上传和下载

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,即服务器已经成功处理了请求

解决浏览器中文件下载时的中文乱码问题:可以在前端页面发送请求前对中文名进行统一编码,然后再后要控制器类中对文件名称进行相应的转码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值