文件上传与实现文件下载

一:文件上传    

  多数文件上传都是通过表单形式提交给后台服务器的,因此,要实现上传功能,就需要提供一个文件上传的表单,而该表单必须满足以下三个条件:

1.form表单的method属性设置为post;

2.form表单的enctype属性设置为multipart/form-data;

3.提供<input type = "file" name = "filename"/>文件上传输入框。

文件上传表单示例如下:(multiple属性是HTML5中新属性,可实现多文件上传)

<from action "uploadUrl" method = "post" enctype = "multipart/form-data">
   <input type = "file" name = "filename" multiple = "multiple"/>
   <input type = "submit" value = "文件上传"/>
   </from>

     当form表单enctype属性为multipart/form-data时,浏览器就会采用二进制流来处理表单数据,服务器端就会对文件上传的请求进行解析处理。Spring MVC通过MultipartResolver实现文件上传功能。MultipartResolver实现文件上传功能。MultipartResolver时一个接口对象,需要通过它的实现类CommonsMultipartResolver来完成文件上传工作。

      可以通过<property>配置了编码格式以及允许上传文件的大小,通过<property>元素可以对文件解析器类CommonsMultipartResolver的如下属性进行配置。

       1.maxUploadSize:上传文件最大长度(以字节为单位);

       2.maxInMemorySize:缓存中的最大尺寸;

       3.defaultEncoding:默认编码格式;

       4.resolveLazily:推迟文件解析,以便在Controller中捕获文件异常。

注意:因为MultipartResolver接口的实现类CommonsMultipartResolver内部是引用multipartResolver字符串获取该实现类对象并完成文件解析的,所以在配置CommonsMultipartResolver时必须指定该Bean的id为multipartResolver。

       由于CommonsMultipartResolver是Spring MVC内部通过Apache Commons FileUpload技术实现的,所以Spring MVC的文件上传还需要依赖Apache Commons FileUpload的组件,即需要导入支持文件上传的相关JAR包。

二:实现文件下载

       文件下载就是将文件服务器中的文件下载到本机上,在Spring MVC环境中,实现文件下载大致可分为如下两个步骤:

1.在客户端页面使用一个文件下载的超链接,该链接的href属性要指定后台文件下载的方法以及文件名(需要先在文件下载目录中添加了一个名称为“1.jpg”的文件)

<a href = "${pageContext.request.contextPath}/downloads?filename = 1.jpg">
文件下载
</a>

      在后台使用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(Media Type.APPLICATION_OCTET_STREAM);
	return new ResponseEntity<byte[]>(fileUtils.readFileToByteArray(file),headers,HttpStatus.OK);
}

      响应头信息的Media Type代表的是Interner Media Type(即互联网媒体类型),也叫做MIME类型,Media Type.APPLICATION_OCTET_STREAM的值为application/octet-stream,即表示以二进制流的形式下载数据。

      HttpStatus类型代表的是Http协议中的状态,示例中的HttpStatus.OK表示200,即服务器已成功处理了请求。

发布了376 篇原创文章 · 获赞 172 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/Eider1998/article/details/104217328