• 全栈开发实战|Spring Boot文件上传与下载


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

    01、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组件依赖即可。

    02、举例说明

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

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

    具体实现步骤如下。

    1引入Apache Commons FileUpload组件依赖

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

    
        commons-fileupload
        commons-fileupload
        
        1.4
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2设置上传文件大小限制

    在Web应用ch7_2的配置文件application.properties中,添加如下配置进行限制上传文件大小。

    #上传文件时,默认单个上传文件大小是1MB,max-file-size设置单个上传文件大小
    spring.servlet.multipart.max-file-size=50MB
    #默认总文件大小是10MB,max-request-size设置总上传文件大小
    spring.servlet.multipart.max-request-size=500MB
    
    • 1
    • 2
    • 3
    • 4

    3创建选择文件视图页面

    在ch7_2应用的src/main/resources/templates目录下,创建选择文件视图页面uploadFile.html。该页面中有个enctype属性值为multipart/form-data的form表单,具体代码如下:

    
    
    
    
    Insert title here
    
    
    
    
    
    

    文件上传示例

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    4创建控制器

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

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

    5创建文件下载视图页面

    在ch7_2应用的src/main/resources/templates目录下,创建文件下载视图页面showFile.html。核心代码如下:

    
      

    文件下载示例

    文件列表

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    6运行

    首先,运行Ch72Application主类。然后,访问http://localhost:8080/ch7_2/uploadFile测试文件上传与下载。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    LeetCode -- 79.单词搜索
    知识图谱从入门到应用——知识图谱的获取与构建:知识工程与知识获取
    算法的时间及空间复杂度
    贪心算法--JavaScript实现
    问题随记 —— Oracle 11g 卸载
    【教3妹学java】JVM调优有哪些工具?
    深入解析 binding:“required“ 与 validate:“required“ 的区别
    vue静态资源的引用(相对路径,绝对路径,@,~的一些笔记,以图片引入为例,含在线演示)
    【基础知识】一网络不通问题处理记录
    JSP企业快信(短信猫+java邮件)的设计与实现
  • 原文地址:https://blog.csdn.net/web13618542420/article/details/126080939