多数文件上传都是通过表单形式提交给后台服务器的,因此,要实现文件上传功能,就需要提供一个文件上传的表单,而该表单必须满足以下3个条件:
form表单的method属性设置为post;
form表单的enctype属性设置为multipart/form-data;
提供<input type="file" name="filename" />的文件上传输入框。
案例如下:
<formaction="uploadUrl"method="post"enctype="multipart/form-data"><inputtype="file"name="filename"multiple="multiple" /><inputtype="submit"value="文件上传" /></form>
Spring MVC通过MultipartResolver实现文件上传功能。MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipartResolver来完成文件上传工作。
<beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--设置请求编码格式,必须与JSP中的pageEncoding属性一致,默认为ISO-8859-1--><propertyname="defaultEncoding"value="UTF-8" /><!--设置允许上传文件的最大值(2M),单位为字节--><propertyname="maxUploadSize"value="2097152" /></bean>
通过<property>元素可以对文件解析器类CommonsMultipartResolver的如下属性进行配置。
maxUploadSize:上传文件最大长度(以字节为单位);
maxInMemorySize:缓存中的最大尺寸;
defaultEncoding:默认编码格式;
resolveLazily:推迟文件解析,以便在Controller中捕获文件大小异常。
Spring MVC文件上传案例:
1、在pom.xml文件添加依赖
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency>
2、在Spring MVC配置文件中配置文件上传
<!--配置文件上传--><beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><propertyname="defaultEncoding"value="UTF-8"/><propertyname="maxUploadSize"value="20971520"/></bean>
3、设置文件上传表单
<formaction="/uploadUserHeader"method="post"enctype="multipart/form-data"><inputtype="file"name="filename"multiple="multiple"><inputtype="submit"value="提交"></form>
4、实现文件上传业务逻辑
// 用户头像上传@PostMapping("/uploadUserHeader")public String uploadUserHeader(@RequestParam("filename")MultipartFile filename,Model model,HttpServletRequest request){// 判断文件是否为空,返回值为false表示文件不为空if (filename.isEmpty()==false){// 获取文件的原名System.out.println("原名:" + filename.getOriginalFilename());// 获取文件的大小System.out.println("文件大小:"+ filename.getSize());// 获取文件的类型System.out.println("文件类型:" + filename.getContentType());System.out.println("name:" + filename.getName());// 保存文件到本地// 指定文件保存目录String path = "C:\\images";// 判断文件目录是否存在,不存在则创建。// 判断文件目录是否存在,不存在则创建File file = new File(path);if (!file.exists()){file.mkdirs();}// 保存文件到物理磁盘中String filePath = path + File.separator+ filename.getOriginalFilename();try{filename.transferTo(new File(filePath));// 返回用户头像存储信息model.addAttribute("path",path);model.addAttribute("headerImg",filename.getOriginalFilename());// String uid = (String) request.getSession().getAttribute("uid");// UserInfoModel userInfoModel =// model.addAttribute("userInfo",userInfoModel);return "userinfo";}catch (Exception e){e.printStackTrace();}}else{System.out.println("文件为空!");}return "userinfo";}
二、文件下载概述
文件下载就是将文件服务器中的文件下载到本机上。
进行文件下载时,为了不以客户端默认的方式处理返回的文件,可以在服务器端对所下载的文件进行相关的配置。
配置的内容包括返回文件的形式、文件的打开方式、文件的下载方式和响应的状态码。
文件的打开方式可以通过响应头Content-Disposition的值来设定。
文件的下载方式可以通过响应头Content-Type中设置的MIME类型来设定。
在Spring MVC环境中,实现文件下载大致可分为如下两个步骤:
1、在客户端页面使用一个文件下载的超链接,该链接的href属性要指定后台文件下载的方法以及文件名。如下:
<a href="${pageContext.request.contextPath }/download?filename=1.jpg">文件下载</a>
2、在后台使用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);}
仅用于交流学习!
夜雨聆风