【SpringMVC笔记11】SpringMVC实现文件上传和下载

时间:2024-11-15 13:50:56

这篇文章,主要介绍SpringMVC框架如何实现文件的上传和下载功能。

目录

一、文件上传

1.1、引入文件上传依赖

1.2、配置文件上传解析器

1.3、创建文件上传控制器

1.4、创建上传表单

1.5、测试文件上传

二、文件下载

2.1、文件下载思路

2.2、代码实现

(1)编写下载控制器

(2)编写JSP页面

 2.3、文件下载应用


一、文件上传

文件上传是实际开发过程中,经常会遇见的需求,例如:上传excel文件,上传word文档,上传pdf文件等等,SpringMVC框架也是支持文件上传功能的,SpringMVC框架是通过第三方依赖实现的文件上传功能,第三方依赖是由Apache提供的Commons FileUploads。

1.1、引入文件上传依赖

SpringMVC框架依赖于commons fileuploads完成文件上传功能,所以首先需要在项目里面引入对应的依赖,如下所示:

  1. <!-- 引入文件上传的依赖 -->
  2. <!-- /artifact/commons-fileupload/commons-fileupload -->
  3. <dependency>
  4. <groupId>commons-fileupload</groupId>
  5. <artifactId>commons-fileupload</artifactId>
  6. <version>1.4</version>
  7. </dependency>

1.2、配置文件上传解析器

引入文件上传依赖之后,此时需要告知SpringMVC框架通过哪个类进行文件上传的处理,这个时候就需要在配置文件里面添加文件上传解析器的相关配置内容,如下所示:

  1. <!-- 配置多部分文件上传解析器 -->
  2. <bean id="multipartResolver" class=""/>

1.3、创建文件上传控制器

创建一个文件上传控制器,里面编写一个专门用于文件上传的控制器方法,并且方法的参数列表里面,通过【MultipartFile】类型进行参数映射。

  1. package ;
  2. import ;
  3. import ;
  4. import ;
  5. import ;
  6. import ;
  7. import ;
  8. import ;
  9. /**
  10. * @version 1.0.0
  11. * @Date: 2022/7/17 21:08
  12. * @Author ZhuYouBin
  13. * @Description
  14. */
  15. @Controller
  16. @RequestMapping("/upload")
  17. public class UploadController {
  18. @RequestMapping("/file")
  19. public String upload(HttpSession session, MultipartFile file) throws IOException {
  20. // 获取上下文对象
  21. ServletContext context = ();
  22. // 获取文件上传路径
  23. String upload = ("upload");
  24. // 将文件上传到 upload 目录下面
  25. String filename = ();
  26. File uploadFile = new File(upload + "/" + filename);
  27. (uploadFile);
  28. ("上传成功");
  29. return "";
  30. }
  31. }

控制器方法里面,首先获取文件需要上传到哪个目录下面,这里我们就将文件上传到项目根目录下面的【upload】目录里面,我们需要事先在【webapp】目录下面创建一个【upload】目录,最好在里面放一个文件,这样在打包的时候,会将upload目录一起打进target包里面。

1.4、创建上传表单

前端页面是通过HTML表单的形式,将需要上传的文件提交到后端控制器里面,需要注意的是,文件上传表单必须满足如下几个条件:

  • method属性必须是POST请求方式。
  • enctype属性必须是multipart/form-data类型的。
  • input标签的type属性必须是file类型的。

这里通过一个jsp文件作为测试案例。

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>文件上传案例</title>
  5. </head>
  6. <body>
  7. <%-- 文件上传 --%>
  8. <form method="post" action="upload/file" enctype="multipart/form-data">
  9. 请选择文件:<input name="file" type="file"> <br>
  10. <input type="submit" value="上传文件">
  11. </form>
  12. </body>
  13. </html>

1.5、测试文件上传

到这里,SpringMVC文件上传基本就完成了,现在可以启动工程,测试文件上传功能了。

以上,就是SpringMVC的文件上传相关步骤。

二、文件下载

文件下载,其实并不算SpringMVC框架的功能,我们只是通过SpringMVC框架作为一个下载的入口,本质上是通过HTTP响应对象实现的文件下载。

2.1、文件下载思路

文件下载,本质上是通过Response响应对象将需要下载的文件,通过二进制流的形式返回给浏览器客户端,并且告诉浏览器这是一个什么类型的数据流(即:文件下载是告诉浏览器以附件的形式接收当前响应),当浏览器客户端接收到响应之后,会解析到对应的数据流类型,例如:excel、word、img等等,浏览器客户端就会直接采用文件的形式下载对应的数据流,大致流程如下所示:

2.2、代码实现

(1)编写下载控制器

创建一个文件下载控制器,里面编写一个文件下载的方法,文件下载步骤如下所示:

文件下载步骤:

  1. 获取response响应输出流。
  2. 设置响应头,以附件形式响应,并且设置附件名称。
  3. 获取需要下载的文件,以输入流的形式读入该文件。
  4. 将下载的文件的二进制流写入输出流里面,响应给浏览器。
  5. 关闭输入、输出流。
  1. package ;
  2. import ;
  3. import ;
  4. import ;
  5. import ;
  6. import ;
  7. import ;
  8. import ;
  9. import ;
  10. /**
  11. * @version 1.0.0
  12. * @Date: 2022/7/17 21:08
  13. * @Author ZhuYouBin
  14. * @Description
  15. */
  16. @Controller
  17. @RequestMapping("/upload")
  18. public class UploadController {
  19. @RequestMapping("/download")
  20. public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {
  21. // 1、获取响应输出流
  22. ServletOutputStream out = ();
  23. // 2、设置响应类型, 设置文件名称
  24. ("Content-Disposition", "attachment;filename=");
  25. // 3、读取 upload 目录下面的图片文件
  26. String realPath = ().getServletContext().getRealPath("upload");
  27. File file = new File(realPath + "/");
  28. // 4、创建文件输入流
  29. FileInputStream fis = new FileInputStream(file);
  30. // 5、将输入流通过输出流响应给浏览器
  31. byte[] bytes = new byte[1024];
  32. int len = 0;
  33. while ((len = (bytes)) != -1) {
  34. // 写入输出流
  35. (bytes, 0, len);
  36. }
  37. // 6、读取完成之后, 关闭输出流
  38. ();
  39. ();
  40. }
  41. }

上面代码进行文件下载的时候,文件名称如果是中文名称,那么下载的文件名称就会出现中文乱码,可以通过如下方式解决:

  1. // 2、设置响应类型, 设置文件名称
  2. // ("Content-Disposition", "attachment;filename=");
  3. // 解决文件名称中文乱码问题
  4. ("Content-Disposition", "attachment;filename=" + ("", "utf-8"));

中文乱码采用【URLEncoder】类的【encode()】方法进行中文编码即可解决。

(2)编写JSP页面

创建一个JSP页面,通过一个超链接的形式请求文件下载的路径,此时会弹出下载提示框,让你选择保存下载的文件路径。

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>文件下载案例</title>
  5. </head>
  6. <body>
  7. <%-- 文件下载 --%>
  8. <a href="${()}/upload/download">文件下载功能</a>
  9. </body>
  10. </html>

启动工程,打开浏览器访问文件下载页面。

 2.3、文件下载应用

在实际开发过程中,文件下载使用最多的是相关excel的文件下载,比如:项目中会有导出数据的功能,这在我目前的公司做的项目里面,导出功能几乎都有遇见过,某个查询页面添加一个excel导出功能,excel导入功能,这其实都是通过文件的上传和下载完成的。

实际开发过程中,对于excel的相关操作,都是采用POI组件比较多一些,当然也可以使用阿里巴巴提供的EasyExcel,这是一款效率比POI更高的excel操作组件。但是,根据我实际的开发经验来看,公司大部分都是采用的POI组件,毕竟是Apache旗下的一个开源项目,经历了多年的更新迭代,可以说是相当的成熟了,也有可能是项目比较老,不想使用最新的组件吧。

在进行excel下载的时候,需要将响应类型设置为如下格式:

  1. // 2、设置响应类型, 设置文件名称
  2. // ("Content-Disposition", "attachment;filename=");
  3. // 解决文件名称中文乱码问题
  4. ("Content-Disposition", "attachment;filename=" + ("", "utf-8"));
  5. // 设置响应类型为 excel
  6. ("application/-excel;charset=UTF-8");

以上,就是SpringMVC框架实现文件上传和下载的相关功能。

综上,这篇文章结束了,主要介绍SpringMVC框架如何实现文件的上传和下载功能。

【源代码地址:/zhuyoubin/ssm_code/tree/master/spring-mvc/springmvc-demo09