ASCII码 ASCII码

SpringBoot实现文件上传与下载功能的示例代码

发布于:2022-06-11 10:04:35  栏目:技术文档

文件上传与下载是Web应用开发中常用的功能之一。接下来我们将讨论如何在Spring Boot的Web应用开发中,如何实现文件的上传与下载,感兴趣的可以了解一下

目录Spring Boot文件上传与下载举例说明1.引入Apache Commons FileUpload组件依赖2.设置上传文件大小限制3.创建选择文件视图页面4.创建控制器5.创建文件下载视图页面6.运行

Spring Boot文件上传与下载在实际的Web应用开发中,为了成功上传文件,必须将表单的method设置为post,并将enctype设置为multipart/form-data。只有这种设置,浏览器才能将所选文件的二进制数据发送给服务器。

从Servlet 3.0开始,就提供了处理文件上传的方法,但这种文件上传需要在Java Servlet中完成,而Spring MVC提供了更简单的封装。Spring MVC是通过Apache Commons FileUpload技术实现一个MultipartResolver的实现类CommonsMultipartResolver完成文件上传的。因此,Spring MVC的文件上传需要依赖Apache Commons FileUpload组件。

Spring MVC将上传文件自动绑定到MultipartFile对象中,MultipartFile提供了获取上传文件内容、文件名等方法,并通过transferTo方法将文件上传到服务器的磁盘中,MultipartFile的常用方法如下:

byte[] getBytes():获取文件数据。String getContentType():获取文件MIME类型,如image/jpeg等。InputStream getInputStream():获取文件流。String getName():获取表单中文件组件的名字。String getOriginalFilename():获取上传文件的原名。long getSize():获取文件的字节大小,单位为byte。boolean isEmpty():是否有(选择)上传文件。void transferTo(File dest):将上传文件保存到一个目标文件中。Spring Boot的spring-boot-starter-web已经集成了Spring MVC,所以使用Spring Boot实现文件上传,更加便捷,只需要引入Apache Commons FileUpload组件依赖即可。

举例说明下面通过一个实例讲解Spring Boot文件上传与下载的实现过程。

【例7】Spring Boot文件上传与下载。

具体实现步骤如下。

1.引入Apache Commons FileUpload组件依赖在Web应用ch7_2的pom.xml文件中,添加Apache Commons FileUpload组件依赖,具体代码如下:```php

<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <!-- 由于commons-fileupload组件不属于Spring Boot,所以需要加上版本 --> <version>1.4</version></dependency>

  1. 2.设置上传文件大小限制
  2. Java技术迷
  3. 在Web应用ch7_2的配置文件application.properties中,添加如下配置进行限制上传文件大小。```php
  4. <!DOCTYPE html>
  5. <html xmlns:th="http://www.thymeleaf.org">
  6. <head>
  7. <meta charset="UTF-8">
  8. <title>Insert title here</title>
  9. <link rel="stylesheet" th:href="@{css/bootstrap.min.css}" />
  10. <!-- 默认访问 src/main/resources/static下的css文件夹-->
  11. <link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" />
  12. </head>
  13. <body>
  14. <div class="panel panel-primary">
  15. <div class="panel-heading">
  16. <h3 class="panel-title">文件上传示例</h3>
  17. </div>
  18. </div>
  19. <div class="container">
  20. <div class="row">
  21. <div class="col-md-6 col-sm-6">
  22. <form class="form-horizontal" action="upload"
  23. method="post" enctype="multipart/form-data">
  24. <div class="form-group">
  25. <div class="input-group col-md-6">
  26. <span class="input-group-addon">
  27. <i class="glyphicon glyphicon-pencil"></i>
  28. </span>
  29. <input class="form-control" type="text"
  30. name="description" th:placeholder="文件描述"/>
  31. </div>
  32. </div>
  33. <div class="form-group">
  34. <div class="input-group col-md-6">
  35. <span class="input-group-addon">
  36. <i class="glyphicon glyphicon-search"></i>
  37. </span>
  38. <input class="form-control" type="file"
  39. name="myfile" th:placeholder="请选择文件"/>
  40. </div>
  41. </div>
  42. <div class="form-group">
  43. <div class="col-md-6">
  44. <div class="btn-group btn-group-justified">
  45. <div class="btn-group">
  46. <button type="submit" class="btn btn-success">
  47. <span class="glyphicon glyphicon-share"></span>
  48. 上传文件
  49. </button>
  50. </div>
  51. </div>
  52. </div>
  53. </div>
  54. </form>
  55. </div>
  56. </div>
  57. </div>
  58. </body>
  59. </html>

4.创建控制器在ch7_2应用的com.ch.ch7_2.controller包中,创建控制器类TestFileUpload。在该类中有4个处理方法,一个是界面导航方法uploadFile,一个是实现文件上传的upload方法,一个是显示将要被下载文件的showDownLoad方法,一个是实现下载功能的download方法。核心代码如下:

  1. @Controller
  2. public class TestFileUpload {
  3. @RequestMapping("/uploadFile")
  4. public String uploadFile() {
  5. return "uploadFile";
  6. }
  7. /**
  8. * 上传文件自动绑定到MultipartFile对象中,
  9. * 在这里使用处理方法的形参接收请求参数。
  10. */
  11. @RequestMapping("/upload")
  12. public String upload(
  13. HttpServletRequest request,
  14. @RequestParam("description") String description,
  15. @RequestParam("myfile") MultipartFile myfile)
  16. throws IllegalStateException, IOException {
  17. System.out.println("文件描述:" + description);
  18. //如果选择了上传文件,将文件上传到指定的目录uploadFiles
  19. if(!myfile.isEmpty()) {
  20. //上传文件路径
  21. String path = request.getServletContext().getRealPath("/uploadFiles/");
  22. //获得上传文件原名
  23. String fileName = myfile.getOriginalFilename();
  24. File filePath = new File(path + File.separator + fileName);
  25. //如果文件目录不存在,创建目录
  26. if(!filePath.getParentFile().exists()) {
  27. filePath.getParentFile().mkdirs();
  28. }
  29. //将上传文件保存到一个目标文件中
  30. myfile.transferTo(filePath);
  31. }
  32. //转发到一个请求处理方法,查询将要下载的文件
  33. return "forward:/showDownLoad";
  34. }
  35. /**
  36. * 显示要下载的文件
  37. */
  38. @RequestMapping("/showDownLoad")
  39. public String showDownLoad(HttpServletRequest request, Model model) {
  40. String path = request.getServletContext().getRealPath("/uploadFiles/");
  41. File fileDir = new File(path);
  42. //从指定目录获得文件列表
  43. File filesList[] = fileDir.listFiles();
  44. model.addAttribute("filesList", filesList);
  45. return "showFile";
  46. }
  47. /**
  48. * 实现下载功能
  49. */
  50. @RequestMapping("/download")
  51. public ResponseEntity<byte[]> download(
  52. HttpServletRequest request,
  53. @RequestParam("filename") String filename,
  54. @RequestHeader("User-Agent") String userAgent) throws IOException {
  55. //下载文件路径
  56. String path = request.getServletContext().getRealPath("/uploadFiles/");
  57. //构建将要下载的文件对象
  58. File downFile = new File(path + File.separator + filename);
  59. //ok表示HTTP中的状态是200
  60. BodyBuilder builder = ResponseEntity.ok();
  61. //内容长度
  62. builder.contentLength(downFile.length());
  63. //application/octet-stream:二进制流数据(最常见的文件下载)
  64. builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
  65. //使用URLEncoder.encode对文件名进行编码
  66. filename = URLEncoder.encode(filename,"UTF-8");
  67. /**
  68. * 设置实际的响应文件名,告诉浏览器文件要用于“下载”和“保存”。
  69. * 不同的浏览器,处理方式不同,根据浏览器的实际情况区别对待。
  70. */
  71. if(userAgent.indexOf("MSIE") > 0) {
  72. //IE浏览器,只需要用UTF-8字符集进行URL编码
  73. builder.header("Content-Disposition", "attachment; filename=" + filename);
  74. }else {
  75. /**非IE浏览器,如FireFox、Chrome等浏览器,则需要说明编码的字符集
  76. * filename后面有个*号,在UTF-8后面有两个单引号
  77. */
  78. builder.header("Content-Disposition", "attachment; filename*=UTF-8''" + filename);
  79. }
  80. return builder.body(FileUtils.readFileToByteArray(downFile));
  81. }
  82. }
相关推荐
阅读 +