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

news2024/9/21 14:32:51

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

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

文件上传

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

  • 上传思路

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

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>文件上传</title>
    </head>
    <body>
        <h1>测试文件上传</h1>
        <form action="${pageContext.request.contextPath}/file/upload" method="post" enctype="multipart/form-data">
            <input type="file" name="file">
            <input type="submit" value="上传文件">
        </form>
    </body>
    </html>
    
  • 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";
        }
    }
    

修改上传文件大小限制

当上传文件超过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 {
    openStyle=openStyle==null?"inline":"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" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>下载</title>
    </head>
    <body>
        <h1>文件下载</h1>
        <ul>
            <li>
                help.md
                <a href="${pageContext.request.contextPath}/file/download?fileName=HELP.md">在线打开</a>
                <a href="${pageContext.request.contextPath}/file/download?fileName=HELP.md&openStyle=attachment">附件下载</a>
            </li>
            <li>
                springmvc.png
                <a href="${pageContext.request.contextPath}/file/download?fileName=20231219161718427.png">在线打开</a>
                <a href="${pageContext.request.contextPath}/file/download?fileName=20231219161718427.png&openStyle=attachment">附件下载</a>
            </li>
        </ul>
    </body>
    </html>
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1325635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度智能云上新:一手实测!0门槛、分钟级打造智能体

“大模型时代真正的价值在于AI原生应用” 继腾讯云推出高性能应用服务HAI&#xff0c;10分钟创建AIGC应用之后&#xff0c;百度云昨天在智算大会上也发布了AI云生应用平台AppBuilder&#xff0c;号称0门槛、分钟级打造智能体agent。AI赛道好不热闹。小编今天就带大家来实测一把…

全光谱护眼灯哪个牌子好?全光谱备考护眼台灯推荐

什么是全光谱&#xff1f;全光谱指的是光谱中包含紫外光、可见光、红外光的光谱曲线&#xff0c;并且在可见光部分中红绿蓝的比例与阳光近似&#xff0c;显色指数接近于100的光谱。太阳光的光谱可以称作全光谱&#xff0c;太阳光的色温是随着四季和早晚时间变化而变化&#xff…

芯知识 | 什么是语音芯片的32Mhz内部振荡及其应用优势

随着科技的飞速发展&#xff0c;语音芯片已经成为现代电子产品中不可或缺的一部分。而在这些芯片的技术参数中&#xff0c;我们常常可以看到“32Mhz内部振荡”这样的描述。那么&#xff0c;究竟什么是语音芯片的32Mhz内部振荡&#xff0c;它又为应用带来了哪些优势呢&#xff1…

Ubuntu 常用命令之 echo 命令用法介绍

echo 是一个在 Ubuntu 系统下常用的命令&#xff0c;主要用于在终端输出字符串或者变量。 echo 的基本语法 echo [option] [string]echo 命令的参数包括 -n&#xff1a;不输出结尾的换行符。-e&#xff1a;启用反斜杠转义字符。-E&#xff1a;禁用反斜杠转义&#xff08;这是…

论文降重方法同义词替换的效果对比与评价 快码论文

大家好&#xff0c;今天来聊聊论文降重方法同义词替换的效果对比与评价&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文降重方法同义词替换的效果对比…

应用在净水器中杀菌消毒的UVC静态杀菌模组

净水器也叫净水机、水质净化器&#xff0c;是按对水的使用要求对水质进行深度过滤、净化处理的水处理设备。平时所讲的净水器&#xff0c;一般是指用作家庭使用的小型净化器。其技术核心为滤芯装置中的过滤膜&#xff0c;主要技术来源于超滤膜、RO反渗透膜、纳滤膜三种。 纯净…

计算机基础:网络基础

目录 ​​​​​​​一.网线制作 1.制作所需要工具 网线制作标准 ​编辑 2.水晶头使用 3.网线钳使用 4.视频教学 二.集线器、交换机介绍 1.OSI七层模型 2.TCP/IP四层参考模型 3.集线器、交换机。路由器介绍 集线器 交换机 路由器 区别 三.路由器的配置 1.路由器设…

OpenAI 官方 Prompt 工程指南:写好 Prompt 的六个策略

其实一直有很多人问我&#xff0c;Prompt 要怎么写效果才好&#xff0c;有没有模板。 我每次都会说&#xff0c;能清晰的表达你的想法&#xff0c;才是最重要的&#xff0c;各种技巧都是其次。但是&#xff0c;我还是希望发给他们一些靠谱的文档。 但是&#xff0c;网上各种所…

易基因: RNA m7G甲基化修饰的生物学功能及其在癌症中的作用|综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 m7G修饰是RNA转录后修饰之一&#xff0c;存在于许多不同类型的RNA中。通过对RNA中m7G修饰的准确鉴定&#xff0c;揭示了m7G在基因表达调控和不同生理功能中的作用。越来越多的证据表明&a…

nginx转发ingress-nginx问题记录

背景 想直接通过域名访问k8s上的服务. 想到k8s上可以直接通过ingress配置. 不过ingress默认启动的端口3xxxxx. 一般不可能让用户访问我们的服务加上端口. 所以现在要解决直接通过80端口访问ingress的问题. 方案 修改ingress-nginx端口(这个是在网上搜到的方案, 但未选择) 这…

C/C++ string.h库中的memcpy()和memmove()

不能把一个数组赋给另一个数组&#xff0c;所以要通过循环把数组中的每个元素赋给另一个数组相应的元素。有一个例外的情况是&#xff1a;使用strcpy()和strncpy()函数来处理字符数组。 memcpy()和memmove()函数提供类似的方法处理任意类型的数组&#xff0c;下面是这两个寒素的…

idea插件在线和离线安装

在线安装 idea在线安装插件比较简单明了&#xff0c;打开setting&#xff08;或者快捷键ctrlalts&#xff09;&#xff0c;找到plugins查找要安装的插件&#xff0c;点击安装&#xff0c;重启idea 离线安装 在官网下载插件安装包 jetbrains官网插件地址 打开idea&#xff0c…

使用HTTP协议有哪些风险?HTTP与HTTPS的区别是什么

作为两种常见的网络协议&#xff0c;HTTP和HTTPS都是用于在浏览器和服务器之间传输数据的。然而在保障数据安全性方面&#xff0c;HTTPS远远优于HTTP。在网络安全愈发重要的当下&#xff0c;HTTP协议的不安全性使得其逐渐被淘汰弃用。那么使用HTTP协议有哪些风险呢&#xff1f;…

在mt5上哪里可以添加指数品种?

在MT5交易平台上&#xff0c;您可以通过以下步骤添加指数品种&#xff08;如股票指数、商品指数等&#xff09;到您的市场观察窗口中&#xff1a; Exness手机登录平台学习指南 步骤一&#xff1a;打开市场观察窗口&#xff1a; 打开MT5交易平台。 在左侧的“市场观察”窗口中&…

c语言:指针作为参数传递

探究实参与形参它们相互独立 由于主调函数的变量a&#xff0c;b与被调函数的形参x&#xff0c;y它们相互独立。函数 swap 可以修改变量x&#xff0c;y&#xff0c;但是却无法影响到主调函数中的a&#xff0c;b。 现在利用取地址运算符&#xff0c;分别打印它们的首地址&#x…

【PHP入门】2.2 流程控制

-流程控制- 流程控制&#xff1a;代码执行的方向 2.2.1控制分类 顺序结构&#xff1a;代码从上往下&#xff0c;顺序执行。&#xff08;代码执行的最基本结构&#xff09; 分支结构&#xff1a;给定一个条件&#xff0c;同时有多种可执行代码&#xff08;块&#xff09;&am…

抖音达人筛选需要注意什么,投放总结

商家想要在抖音开拓市场&#xff0c;带动产品销路&#xff0c;寻找达人投放是必行之道。那么抖音达人筛选需要注意什么&#xff0c;我们为大家总结了如下流程。 一、以基础数据找达人 以基础数据进行抖音达人筛选&#xff0c;可以称得上是很直接的方法了。这里的接触数据包括粉…

安防视频融合云平台/智慧监控平台EasyCVR如何添加验证码调用接口?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

机器学习 | 聚类Clustering 算法

物以类聚人以群分。 什么是聚类呢&#xff1f; 1、核心思想和原理 聚类的目的 同簇高相似度 不同簇高相异度 同类尽量相聚 不同类尽量分离 聚类和分类的区别 分类 classification 监督学习 训练获得分类器 预测未知数据 聚类 clustering 无监督学习&#xff0c;不关心类别标签 …

红队打靶练习:WINTERMUTE: 1

前言 网络扫描&#xff08;Nmap、netdiscover&#xff09; HTTP 服务枚举 使用电子邮件日志文件在浏览器中进行目录遍历 利用 SMTP RCPT 选项中的操作系统命令注入 生成 PHP 后门 (Msfvenom) 执行RCPT选项中嵌入的后门 反向连接&#xff08;Metasploit&#xff09; 导入 pytho…