文件的上传和下载--SpringMVC

文件的上传和下载是项目开发中最常用的功能,例如图片的上传和下载、邮件附件的上传和下载等。 接下来,将对Spring MVC环境中文件的上传和下载进行详细的讲解。 一.文件上传 多数文件上传都是通过表单形式提交给后台服务器的,因此,要实现文件上传功能,就需要提供一个文件上传的表单,而该表单必须满足以下3个条件: 1)form表单的method属性设置为post 2)form表单的enctype属性设置为multipart/form-data 3)提供的文件上传输入框。 文件上传表单的实例代码如下: 复制代码
复制代码 Spring MVC为文件上传提供了直接的支持,这种支持是通过MultipartResolver(多部件解析器)对象实现的。MultipartResolver是一个接口对象,需要通过它的实现类CommonsMultipartResolver来完成文件上传工作。在Spring MVC中使用MultipartResolver对象非常简单,只需要在配置文件中定义MultipartResolver接口的Bean即可,其具体配置方式如下: 复制代码 复制代码 通过元素可以对文件解析类CommonsMultipartResolver的如下属性进行配置。 1)maxUploadSize:上传文件最大长度(以字节为单位) 2)maxInMemorySize:缓存中的最大尺寸 3)defaultEncoding:默认编码格式 4)resolverLazily:推迟文件解析,以便在Controller中捕获文件大小异常 注:在配置CommonsMultipartResolver时必须指定该Bean的id为multipartResolver 需要导入支持文件上传的相关JAR包,通过Apache官网地址“http://commons.apache.org/”下载(进入该网址后,在Apache Conmmons Proper下方列表的Components列中找到FileUpload和IO,单击链接后,即可在打开页面找到下载链接)具体如下: 1)commons-fileupload-1.3.2.jar 2)commons-io-2.5.jar 当完成页面表单和文件上传解析器的配置后,在Controller中编写文件上传的方法即可实现文件上传。文件上传的方法代码如下: 复制代码 @Controller public class FileUploadController { @RequestMapping("fileUpload") public String handleFormUpload(@RequestParam("name") String name,@RequestParam("filename") MultipartFile file,...) { if(!file.isEmpty()) { //具体的执行方法 ... return "uploadSuccess";//跳转到成功页面 } return "uploadFailure";//跳转到失败页面 } } 复制代码 在上述代码中,包含一个MultipartFile接口类型的参数file,上传到程序中的文件就是被封装在该参数中的。org.springframework.web.multipart.MultipartFile接口中提供了获取上传文件、文件名称等方法,这些方法及说明如下表01所示: 方法 说明 byte[] getBytes() 以字节数组的形式返回文件的内容 String getContentType() 返回文件的内容类型 InputStream getInputStream() 读取文件内容,返回一个InputStream流 String getName() 获取多部件form表单的参数名称 String getOriginalFilename() 获取上传文件的初始化名 long getSize() 获取上传文件的大小,单位是字节 boolean isEmpty() 判断上传的文件是否为空 void transferTo(File file) 将上传文件保存到目标目录下 表01:MultipartFile接口中的主要方法 接下来我们用一个具体的案例来演示文件上传功能的实现,具体步骤如下: (1)在eclipse中创建一个名为fileUpload的动态Web项目,将Spring MVC相关的JAR包以及支持文件上传下载的JAR包添加到项目的lib目录中。添加后的lib目录如图01所示: 图01:Spring MVC环境下文件上传下载的JAR包 (2)在web.xml文件中,配置Spring MVC的前端控制器等。 复制代码 fileUpload index.html hello org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc-config.xml 1 hello *.action 复制代码 (3)右键fileUpload项目,新建Source Floder文件夹(专门用来存放配置文件等),创建并编写Spring MVC的核心配置文件springmvc-config.xml,如文件01所示。 复制代码 复制代码 文件01:springmvc-config.xml (4)在WebContext目录下,创建一个用于上传文件的页面fileUpload.jsp,编辑后如文件02所示: 复制代码 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 文件上传
上传人:
请选择文件:
复制代码 文件02:fileUpload.jsp (5)在WEB-INF目录下,创建jsp文件夹,并在文件夹中创建success.jsp和error.jsp文件,分别在两个文件的元素内编写显示上传成功的信息(如:"文件上传成功!")和显示上传失败的信息(如"文件上传失败,请重新上传!") (6)在src目录下,创建一个com.neuedu.controller包,在该包下创建一个用于文件上传的控制器类FileUploadController,如文件03所示: 复制代码 package com.neuedu.controller; import java.io.File; import java.util.List; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; /* * 文件上传 * */ @Controller public class FileUploadController { /* * 执行文件上传 * */ @RequestMapping("/fileUpload") public String handleFormUpload(@RequestParam("name") String name,@RequestParam("uploadfile") List uploadfile,HttpServletRequest request) { //判断所上传文件是否存在 if(!uploadfile.isEmpty() && uploadfile.size() > 0) { //循环输出上传的文件 for(MultipartFile file : uploadfile) { //获取上传文件的原始名称 String originalFilename = file.getOriginalFilename(); //设置上传文件的保存地址目录 String dirPath = request.getServletContext().getRealPath("/upload/"); File filePath = new File(dirPath); //如果保存文件的地址不存在,就先创建目录 if(!filePath.exists()) { filePath.mkdirs(); } //使用UUID重新命名上传的文件名称(上传人_uuid_原始文件名称) String newFilename = name+"_"+UUID.randomUUID()+"_"+originalFilename; try { //使用MultipartFile接口的方法完成文件上传到指定位置 file.transferTo(new File(dirPath + newFilename)); }catch(Exception e) { e.printStackTrace(); return "error"; } } //跳转的成功页面 return "success"; }else { return "error"; } } } 复制代码 文件03:FileUploadController.java (7)将项目发布到Tomcat服务器中并启动,在浏览器中访问地址 http://localhost:8080/fileUpload/fileUpload.jsp,填写上传人,选择文件上传,效果如下图: (8)如果成功上传,此时查看项目的发布目录,即可发现在fileUpload项目中多了一个upload文件夹,该文件夹存放着你所上传的文件,并且以"上传人_uuid_原始文件名称"的形式。 注意:upload文件夹是在项目的发布路径中,而不是创建的项目所在目录。如果未更改项目的发布路径,则要去工作空间的metadata目录中寻找项目发布目录(路径为:workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\fileUpload\upload);如果将项目的发布路径已经更改到Tomcat中,则需要在Tomcat的webapps目录中寻找项目。 至此,文件上传功能的实现演示完毕,整个项目目录如图02所示: 二.文件下载 文件下载就是将文件服务器中的文件下载到本机上。在Spring MVC环境中实现文件下载大致可分为如下两个步骤: <1>在客户端页面使用一个文件下载的超链接,该链接的href属性要指定后台文件下载的方法和文件名(需要先在文件下载目录中添加一个名称为“1.jpg”的文件),具体代码实例如下: 复制代码 文件下载 复制代码 <2>在后台Controller类中,使用Spring MVC提供的文件下载方法进行文件下载。 Spring MVC提供了一个ResponseEntity类型的对象,使用它可以定义返回的HttpHeaders对象和HttpStatus对象,通过对这两个对象的设置,即可完成下载文件时所需的配置信息。文件下载的实例代码如下所示: 复制代码 @RequestMapping("/download") Public ResponseEntity 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); //使用Spring MVC框架的ResponseEntity对象封装返回下载数据 return new ResponseEntity(FileUtils.readFileToByteArray(file),headers,HttpStatus.OK); } 复制代码 接下来我们用一个具体的案例来演示文件下载功能的实现,具体步骤如下: (1)按照之前的步骤搭建好环境和配置文件,创建一个页面文件fileDownload.jsp,将上面<1>步骤的代码插入body元素之间,如下文件04所示: 复制代码 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 文件下载 文件下载 复制代码 文件04:fileDownload.jsp (2)在src下新建com.neuedu.controller包,并在该包下新建FileUploadController,将上面<2>步骤的fileDownload()方法编写在FileUploadController类中。如文件05所示: 复制代码 package com.neuedu.controller; import java.io.File; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.FileUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class fileDownloadController { @RequestMapping("/fileDownload") public ResponseEntity 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); //使用Spring MVC框架的ResponseEntity对象封装返回下载数据 return new ResponseEntity(FileUtils.readFileToByteArray(file),headers,HttpStatus.OK); } } 复制代码 文件05:FileUploadController.java (3)发布项目并启动Tomcat服务器,在文件下载目录下 "workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\fileDownload"下新建一个文件夹"upload"(命名要和fileDownload()方法中的指定要下载的文件所在路径一样),将一个命名为"1.jpg"(命名要与超链接中的参数filename的属性值一致)的图片拖进upload文件夹中。 最后,在浏览器中访问地址http://localhost:8080/fileDownload/fileDownload.jsp,效果如下: 单击”文件下载“链接后,出现下载提示弹窗,如下图所示: 选择”保存文件“,并单击”确定“按钮后,即可下载该文件。(在浏览器的下载窗口就可看到所下载的文件啦!!!) 文件的下载功能的实现演示到此完毕,整个项目目录如图02所示: 中文名称的文件下载: 上面例子通过Spring MVC实现了文件下载功能,但此案例代码只适用于非中文名称的文件下载。当对中文名称的文件进行下载时,因为各个浏览器内部转码机制的不同,就会出现乱码和解析异常问题。 为解决浏览器中文件下载时中文名称的乱码问题,可以在前端页面发送请求前先对中文名进行统一编码,然后在后台控制器类中对文件名称进行相应的转码。 (1)在下载页面中对中文文件名编码。可以使用URLEncoder类中的encoder(String s,String enc)方法将中文转为UTF-8编码。该方法中第一个参数表示需要转码的字符串,第二个参数表示编码格式,fileDownload.jsp文件修改如下: 复制代码 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="java.net.URLEncoder" %> 文件下载 ">文件下载 复制代码 (2)修改控制器类FileUploadController中的fileDownload()方法,并增加对文件名进行编码的方法,代码如下: 复制代码 package com.neuedu.controller; import java.io.File; import java.net.URLEncoder; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.FileUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class fileDownloadController {
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信