Spring Boot学习随笔- 文件上传和下载(在线打卡、附件下载、MultipartFile ...

打印 上一主题 下一主题

主题 912|帖子 912|积分 2736

学习视频:【编程不良人】2021年SpringBoot最新最全教程
第十二章、文件上传、下载

文件上传

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

  • 上传思路

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

  • upload.jsp
    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2.          pageEncoding="UTF-8" %>
    3. <!DOCTYPE html>
    4. <html>
    5. <head>
    6.     <title>文件上传</title>
    7. </head>
    8. <body>
    9.     <h1>测试文件上传</h1>
    10.     <form action="${pageContext.request.contextPath}/file/upload" method="post" enctype="multipart/form-data">
    11.         <input type="file" name="file">
    12.         <input type="submit" value="上传文件">
    13.     </form>
    14. </body>
    15. </html>
    复制代码
  • Controller
    1. @Controller
    2. @RequestMapping("file")
    3. public class FileController {
    4.     private final Logger log = LoggerFactory.getLogger(FileController.class);
    5.     /**
    6.      * 测试文件上传
    7.      */
    8.     @RequestMapping("upload")
    9.     public String upload(MultipartFile file, HttpServletRequest request) throws IOException { // 变量名要和form的input type="file"的name名一致
    10.         log.debug("文件名:{}", file.getOriginalFilename());
    11.         log.debug("文件大小:{}", file.getSize());
    12.         log.debug("文件类型:{}", file.getContentType());
    13.         // 处理文件上传 根据相对路径 上传 upload 获取绝对路径(真实路径) /users/desktop
    14.         String realpath = request.getSession().getServletContext().getRealPath("/upload");
    15.         log.debug("获取绝对路径:{}", realpath);
    16.         // 修改文件名
    17.         String fileName = file.getOriginalFilename();
    18.         int i = fileName.lastIndexOf(".");
    19.         String suffix = fileName.substring(i);
    20.         String newFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())+suffix;
    21.         // 上传文件 参数1将文件写进目录
    22.         file.transferTo(new File(realpath,newFileName));
    23.         return "redirect:/upload.jsp";
    24.     }
    25. }
    复制代码
修改上传文件大小限制


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

  • 修改配置
    1. spring:
    2.         servlet:
    3.           multipart:
    4.             max-request-size: 120MB # 运行请求传递文件大小
    5.             max-file-size: 120MB  # 运行服务器可以处理的最大文件大小
    复制代码
传统上传方式不适用于Jar包部署Linux

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

  • 修改上传方式(文件上传位置解耦合)
    1. @Value("${file.upload.dir}")
    2. private String **realPath**;
    3. /**
    4. * 【推荐】适用于任何一种部署方式
    5. * @param file
    6. * @return
    7. * @throws IOException
    8. */
    9. @RequestMapping("uploadByJarDeploy")
    10. public String uploadByJarDeploy(MultipartFile file) throws IOException {
    11.     log.debug("文件名:{}", file.getOriginalFilename());
    12.     log.debug("文件大小:{}", file.getSize());
    13.     log.debug("文件类型:{}", file.getContentType());
    14.     // 修改文件名
    15.     String fileName = file.getOriginalFilename();
    16.     int i = fileName.lastIndexOf(".");
    17.     String suffix = fileName.substring(i);
    18.     String newFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + suffix;
    19.     // 文件上传
    20.     file.transferTo(new File(**realPath**,newFileName));
    21.     return "redirect:/upload.jsp";
    22. }
    复制代码
  • 配置
    1. # 指定文件上传位置
    2. file:
    3.   upload:
    4.     dir: D:\Desktop\test\photo
    复制代码
文件下载

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

  • 开发步骤

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

  • controller
    1. @Controller
    2. @RequestMapping("file")
    3. public class FileController {
    4.     private Logger log = LoggerFactory.getLogger(FileController.class);
    5.     @Value("${file.download.dir}")
    6.     private String realPath;
    7.     /**
    8.      * 文件下载
    9.      * @param fileName
    10.      */
    11.     @RequestMapping("download")
    12.     public void download(StringopenStyle, String fileName, HttpServletResponse response) throws IOException {
    13. openStyle=openStyle==null?"inline":"attachment";
    14.         log.debug("当前下载文件名:{}", fileName);
    15.         log.debug("当前下载目录:{}", realPath);
    16.         // 1.指定目录中读取文件
    17.         File file = new File(realPath, fileName);
    18.         // 2.将文件读取为文件输入流
    19.         FileInputStream is = new FileInputStream(file);
    20.         // 3.获取响应输出流
    21.         response.setContentType("text/plain;charset=UTF-8");
    22.         ServletOutputStream os = response.getOutputStream();
    23.         // 4.附件下载文件  attachment(附件)  inline(在线打开)
    24.         response.setHeader("content-disposition",openStyle+";fileName=" + URLEncoder.encode(fileName,"UTF-8"));
    25.         // 5.输入流复制给输出流
    26.         // 传统写法
    27. //        int len = 0;
    28. //        byte[] b = new byte[1024];
    29. //        while (true) {
    30. //            len = is.read(b);
    31. //            if (len == -1) {
    32. //                break;
    33. //            }
    34. //            os.write(b, 0, len);
    35. //        }
    36. //        is.close();
    37.         // spring提供的复制方法,会自动释放is和os
    38.         FileCopyUtils.copy(is, os);
    39.     }
    40. }
    复制代码
  • download.jsp
    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2.          pageEncoding="UTF-8" %>
    3. <!DOCTYPE html>
    4. <html>
    5. <head>
    6.     <title>下载</title>
    7. </head>
    8. <body>
    9.     <h1>文件下载</h1>
    10.     <ul>
    11.         <li>
    12.             help.md
    13.             <a target="_blank" href="https://www.cnblogs.com/${pageContext.request.contextPath}/file/download?fileName=HELP.md">在线打开</a>
    14.             <a target="_blank" href="https://www.cnblogs.com/${pageContext.request.contextPath}/file/download?fileName=HELP.md&openStyle=attachment">附件下载</a>
    15.         </li>
    16.         <li>
    17.             springmvc.png
    18.             <a target="_blank" href="https://www.cnblogs.com/${pageContext.request.contextPath}/file/download?fileName=20231219161718427.png">在线打开</a>
    19.             <a target="_blank" href="https://www.cnblogs.com/${pageContext.request.contextPath}/file/download?fileName=20231219161718427.png&openStyle=attachment">附件下载</a>
    20.         </li>
    21.     </ul>
    22. </body>
    23. </html>
    复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表