Spring Boot学习随笔- 文件上传和下载(在线打卡、附件下载、MultipartFile)
作者:mmseoamin日期:2023-12-21

学习视频:【编程不良人】2021年SpringBoot最新最全教程

第十二章、文件上传、下载

文件上传

文件上传是指将文件从客户端计算机传输到服务器的过程。

  • 上传思路

    • 前端的上传页面:提交方式必须为post,enctype属性必须为multipart/form-data
    • 开发后端的Controller
    • 后端方法接收参数必须和前端标签的name名一致
    • upload.jsp

      <%@ page language="java" contentType="text/html; charset=UTF-8"
               pageEncoding="UTF-8" %>
      
      
      
          文件上传
      
      
          

      测试文件上传

    • Controller

      @Controller
      @RequestMapping("file")
      public class FileController {
          private final Logger log = LoggerFactory.getLogger(FileController.class);
          /**
           * 测试文件上传
           */
          @RequestMapping("upload")
          public String upload(MultipartFile file, HttpServletRequest request) throws IOException { // 变量名要和form的input type="file"的name名一致
              log.debug("文件名:{}", file.getOriginalFilename());
              log.debug("文件大小:{}", file.getSize());
              log.debug("文件类型:{}", file.getContentType());
              // 处理文件上传 根据相对路径 上传 upload 获取绝对路径(真实路径) /users/desktop
              String realpath = request.getSession().getServletContext().getRealPath("/upload");
              log.debug("获取绝对路径:{}", realpath);
              // 修改文件名
              String fileName = file.getOriginalFilename();
              int i = fileName.lastIndexOf(".");
              String suffix = fileName.substring(i);
              String newFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())+suffix;
              // 上传文件 参数1将文件写进目录
              file.transferTo(new File(realpath,newFileName));
              return "redirect:/upload.jsp";
          }
      }
      

      修改上传文件大小限制

      Spring Boot学习随笔- 文件上传和下载(在线打卡、附件下载、MultipartFile),第1张

      当上传文件超过10M则会报错

      • 修改配置

        spring:
        	servlet:
        	  multipart:
        	    max-request-size: 120MB # 运行请求传递文件大小
        	    max-file-size: 120MB  # 运行服务器可以处理的最大文件大小
        

        传统上传方式不适用于Jar包部署Linux

        在传统的Spring Boot 应用程序中,当你在 Linux 上通过 JAR 包部署后,绝对路径上传文件会失效的原因是因为 JAR 包中的文件无法通过绝对路径进行访问。

        • 修改上传方式(文件上传位置解耦合)

          @Value("${file.upload.dir}")
          private String **realPath**;
          /**
           * 【推荐】适用于任何一种部署方式
           * @param file
           * @return
           * @throws IOException
           */
          @RequestMapping("uploadByJarDeploy")
          public String uploadByJarDeploy(MultipartFile file) throws IOException {
              log.debug("文件名:{}", file.getOriginalFilename());
              log.debug("文件大小:{}", file.getSize());
              log.debug("文件类型:{}", file.getContentType());
              // 修改文件名
              String fileName = file.getOriginalFilename();
              int i = fileName.lastIndexOf(".");
              String suffix = fileName.substring(i);
              String newFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + suffix;
              // 文件上传
              file.transferTo(new File(**realPath**,newFileName));
              return "redirect:/upload.jsp";
          }
          
        • 配置

          # 指定文件上传位置
          file:
            upload:
              dir: D:\Desktop\test\photo 
          

          文件下载

          文件下载是指从服务器获取文件并保存到本地计算机或设备的过程。

          • 开发步骤

            1. 确定项目中哪些资源可以被下载
            2. 将可以被下载资源放入服务器指定位置
            3. 项目中开发一个下载页面/提供下载文件的链接
            4. 开发下载controller
          • controller

            @Controller
            @RequestMapping("file")
            public class FileController {
                private Logger log = LoggerFactory.getLogger(FileController.class);
                @Value("${file.download.dir}")
                private String realPath;
                /**
                 * 文件下载
                 * @param fileName
                 */
                @RequestMapping("download")
                public void download(StringopenStyle, String fileName, HttpServletResponse response) throws IOException {
            openinline":"attachment";
                    log.debug("当前下载文件名:{}", fileName);
                    log.debug("当前下载目录:{}", realPath);
                    // 1.指定目录中读取文件
                    File file = new File(realPath, fileName);
                    // 2.将文件读取为文件输入流
                    FileInputStream is = new FileInputStream(file);
                    // 3.获取响应输出流
                    response.setContentType("text/plain;charset=UTF-8");
                    ServletOutputStream os = response.getOutputStream();
                    // 4.附件下载文件  attachment(附件)  inline(在线打开)
                    response.setHeader("content-disposition",openStyle+";fileName=" + URLEncoder.encode(fileName,"UTF-8"));
                    // 5.输入流复制给输出流
                    // 传统写法
            //        int len = 0;
            //        byte[] b = new byte[1024];
            //        while (true) {
            //            len = is.read(b);
            //            if (len == -1) {
            //                break;
            //            }
            //            os.write(b, 0, len);
            //        }
            //        is.close();
                    // spring提供的复制方法,会自动释放is和os
                    FileCopyUtils.copy(is, os);
                }
            }
            
          • download.jsp

            <%@ page language="java" contentType="text/html; charset=UTF-8"
                     pageEncoding="UTF-8" %>
            
            
            
                下载
            
            
                

            文件下载