【SpringBoot】简单的文件上传和文件下载以及图片回显

news2024/11/17 23:33:43

前言

小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,让我们共同进步,欢迎关注!


目录

前言

一、文件上传与下载

1、文件上传

第一步:pom.xml

第三步:在全局配置文件中添加文件上传的相关配置

第四步:进行文件上传处理,实现文件上传功能

二、回显图片

第一步:创建并编写图片回显页面

三、文件下载

第一步:添加文件下载依赖

第二步:创建文件下载页面

第三步:创建控制器


一、文件上传与下载


​ 在开发Web应用时,文件上传和下载是很常见的一个需求。浏览器通过表单形式将文件以流的形式传递给服务器,服务器再对上传的数据进行解析处理。下载文件通过 IO 流实现,大多数框架并没有对文件下载进行封装处理,并且文件下载时涉及不同浏览器的解析处理,可能会出现中文乱码的情况。

1、文件上传


实现文件上传,需要满足三个条件。

1、表单提交方式必须是 POST
2、表单需要设置 enctype 属性,且值为 multipart/form-data
3、表单需要设置一个文件域,也就是表单项 type = "file"

第一步:pom.xml


注意:SpringBoot并没有提供文件上传所需要的 jar 包或依赖,需要再项目中加入文件上传的相关 jar 包或 maven 依赖,如图所示:

 下面是依赖包:

(注意:看你创建的springboot项目是什么版本的,如果你jdk使用的是1.8,那么创建项目的时候就要选择2.7.8或者2.7.9,这个时候使用下面的依赖版本是没有冲突的,因为小编也是使用的2.7.8,如果使用3及3以上的版本出现问题的话,可以考虑是不是包冲突了)

        <!--文件上传-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.5</version>
        </dependency>

第二步: 编写文件上传的表单页面

在项目中的 resources/templates 目录创建一个名为 upload.html 页面

<form th:action="@{/upload}" method="post" enctype="multipart/form-data">
    <div>
        <label>选择文件:</label>
        <input type="file" name="attach"/>
    </div>
    <div style="margin-top:20px">
        <input type="submit" value="确认上传"/>
    </div>
</form>

第三步:在全局配置文件中添加文件上传的相关配置

application.properties

  #设置单个文件大小
  spring.servlet.multipart.max-file-size=50MB
  #设置总上传数据大小
  spring.servlet.multipart.max-request-size=50MB

  #自定义属性
  #设置文件上传位置(绝对路径)
  file.upload.path=d:/

  #设置文件上传后回显位置(相对路径)
  file.upload.path.relative=/**
  # 这是连接数据库8.0及以上的版本,如果是5版本就不需要加cj,在url中不需要加时区,8版本不加时区的话 
  # 可能会报时区的问题

  spring.datasource.driver-class-name= com.mysql.cj.jdbc.Driver
  datasource.url= localhost:3306/testdb
  spring.datasource.url= jdbc:mysql://${datasource.url}? 
  useSSL=false&useUnicode=true&characterEncoding=utf- 
  8&allowMultiQueries=true&autoReconnect=true&maxReconnects=10&serverTimezone=UTC
  spring.datasource.username= root
  spring.datasource.password= root

需要注意的是,通过 spring.servlet.multipart.max-file-size 属性设置单个上传文件的大小限制,默认1MB,通过spring.servlet.multipart.max-request-size 属性设置所有上传文件的大小限制,默认为 10MB。开发过程中,需要结合实际需求合理设置文件大小。

第四步:进行文件上传处理,实现文件上传功能

在 controller 包下创建控制器

package com.lyn.controller;

  import org.apache.commons.io.FilenameUtils;

  import org.springframework.beans.factory.annotation.Value;

  import org.springframework.stereotype.Controller;

  import org.springframework.ui.Model;

  import org.springframework.web.bind.annotation.RequestMapping;

  import org.springframework.web.multipart.MultipartFile;

  

  import java.io.File;

  import java.io.IOException;

  import java.text.SimpleDateFormat;

  import java.util.Date;

  import java.util.UUID;

  

  @Controller

  public class FileController{

    // 文件上传位置

    @Value("${file.upload.path}")

    private String filePath;

  

    /**

     * 向文件上传页面跳转

     * @return

     */

    @RequestMapping("/toUpload")

    public String toUpload(){

        return "upload";

    }

  

    /**

     * 文件上传

     * @param attach

     * @param model

     * @return

     */

    @RequestMapping("/upload")

    public String upload(MultipartFile attach, Model model){

        // 判断文件是否为空,不为空则进行文件上传

        if(!attach.isEmpty()){

            // 获取源文件名称

            String fileName = attach.getOriginalFilename();

            // 获取源文件后缀名

            String suffix = FilenameUtils.getExtension(fileName);

            // 使用UUID重命名文件名称

            String newFileName = UUID.randomUUID().toString().replace("-","")+(".")+suffix;

            // 使用日期解决同一文件夹中文件过多问题(以当前日期命名文件夹)

            String datePath = new SimpleDateFormat("yyyy-MM-dd").format(new Date());

            // 组装最终文件名

            String finalName = datePath+"/"+newFileName;

            // 构建文件对象

            File dest = new File(filePath + finalName);

            // 判断该文件夹是否存在,不存在则创建

            if(!dest.getParentFile().exists()){

                dest.getParentFile().mkdirs(); // 创建文件夹

            }

            try{

                // 将文件保存到硬盘

                attach.transferTo(dest);

                // 将当前图片放到模型中,便于页面回显

                model.addAttribute("image",finalName);

            }catch(IOException e){

                e.printStackTrace();

            }

        }

        // 返回页面(该页面是templates目录下的页面)

        return "show";

    }

}

第五步:测试

http://localhost:8080/toUpload

二、回显图片

如果上传的文件是图片,且需要在页面中将图片显示,则需要对图片进行数据回显,需要完成两个步骤,分别是:

第一步:创建并编写图片回显页面

在项目中的 resources/templates 目录下创建 show.html 页面,代码如下所示:

<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org">

<head>

    <meta charset="UTF-8">

    <title>图片回显</title>

</head>

<body>

    <img th:src="@{'/'+${image}}"/>

</body>

</html>

创建并编写文件上传配置类

第二步:在项目中的 config 包下新建 UploadConfig 类

package com.lyn.config;

  import org.springframework.beans.factory.annotation.Value;

  import org.springframework.context.annotation.Configuration;

  import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;

  import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

  

  @Configuration

  public class UploadConfig implements WebMvcConfigurer {

    // 上传地址

    @Value("${file.upload.path}")

    private String filePath;

  

    // 显示相对地址

    @Value("${file.upload.path.relative}")

    private String fileRelativePath;

  

  
    //地址映射 url地址与本地磁盘地址映射

    @Override

    public void addResourceHandlers(ResourceHandlerRegistry registry){

        // 读取本地文件需要加上 file:/    
    registry.addResourceHandler(fileRelativePath).addResourceLocations("file:/"+filePath);

    }

}

三、文件下载

在Web开发中,文件下载能够通过IO流实现,所以多数框架并没有对文件下载进行封装处理。文件下载时涉及不同浏览器的解析处理,可能会出现中文乱码情况,并且不同浏览器之间的解析处理方式也会有所不同,例如谷歌和IE浏览器。

第一步:添加文件下载依赖

在 pom.xml 文件中引入文件下载的工具依赖 commons-io,还是需要注意版本的兼容性

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

第二步:创建文件下载页面

在 resuources/templates 目录下创建 download.html 页面,代码如下:

<h2>文件下载</h2>
<!-- 注意:这个路径是你自己上传文件的文件夹,比如小编的就在d盘有一个2023-02-20的文件夹-->
<a th:href="@{2023-02-20/1.jpg}" download="1.jpg">html页面下载</a>
</body>

如图:

 

第三步:创建控制器

将方法写在文件上传的controller中

  /**
 * 文件下载的两种方式,使用其中一种下载即可
 */
@RequestMapping("/download")
    public String downLoad(){
        return "download";
    }

    @GetMapping("/t3")
    public ResponseEntity<ByteArrayResource> down3() throws Exception {
        byte[] bytes = Files.readAllBytes(new File("d:\\2023-02-20\\1.jpg").toPath());
        ByteArrayResource bar = new ByteArrayResource(bytes);
        return ResponseEntity.ok()
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .header("Content-disposition", "attachment; filename=1.jpg")
                .body(bar);
    }

以上就是小编所写得文件上传,回显图片,以及文件下载,希望能够帮助到大家!!谢谢各位大佬的观看!!

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

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

相关文章

k8s全解

目录说明Kubernetes介绍应用部署方式演变kubernetes简介kubernetes组件kubernetes概念kubernetes集群环境搭建安装方式kubeadm二进制包集群类型安装要求最终目标准备环境环境初始化服务部署kubeadm中的命令(一般用不着)资源管理YAML语言介绍资源管理方式命令式对象管理kubectl命…

【涨薪技术】0到1学会性能测试 —— 参数化关联

前言 上一次推文我们分享了性能测试工作原理、事务、检查点&#xff01;今天给大家带来性能测试参数化&#xff0c;检查点知识&#xff01;后续文章都会系统分享干货&#xff0c;带大家从0到1学会性能测试&#xff0c;另外还有教程等同步资料&#xff0c;文末免费获取~ 01、性…

什么是分布式锁?几种分布式锁分别是怎么实现的?

一、什么是分布式锁&#xff1a; 1、什么是分布式锁&#xff1a; 分布式锁&#xff0c;即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题&#xff0c;而分布式锁&#xff0c;就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是&am…

python语音识别whisper

一、背景 最近想提取一些视频的字幕&#xff0c;语音文案&#xff0c;研究了一波 二、whisper语音识别 Whisper 是一种通用的语音识别模型。它在不同音频的大型数据集上进行训练&#xff0c;也是一个多任务模型&#xff0c;可以执行多语言语音识别以及语音翻译和语言识别。 …

Chat Support Board WordPress聊天插件 v3.5.8

功能列表 支持和聊天功能 Slack聊天完全同步 - 直接从Slack发送和接收用户信息。 立即工作 - 只需插入短码&#xff0c;即可立即安装和使用。 丰富的信息 - Dialogflow机器人发送丰富的信息。 机器人--集成一个由API.AI驱动的多语言机器人。 电子邮件通知 - 当收到回复时&#…

JUC 之 比较交换 CAS

—— CAS&#xff08;Compare And Swap&#xff09; 没有 CAS 之前&#xff0c;多线程环境下不使用原子类保证线程安全 i&#xff0c;只能通过 synchronized 加锁的方式&#xff0c;高并发多写情况下&#xff0c;性能影响很大&#xff1b;使用 CAS 之后&#xff0c;可以使用原子…

公司对不同职级能力抽象要求的具体化

要先把当前级别要求的能力提升到精通&#xff0c;然后尝试做下一级别的事情。 但可能不确定高一级的能力要求究竟怎样&#xff0c;不同Title&#xff0c;如“工程师”“高级工程师”和“资深工程师”等。但这样 Title 对我们理解不同级别的能力要求&#xff0c;完全无用。“高…

RecycleView详解

listview缓存请看: listview优化和详解RecycleView 和 ListView对比&#xff1a;使用方法上ListView&#xff1a;继承重写 BaseAdapter&#xff0c;自定义 ViewHolder 与 converView优化。RecyclerView: 继承重写 RecyclerView.Adapter 与 RecyclerView.ViewHolder。设置 Layou…

【华为OD机试模拟题】用 C++ 实现 - 英文输入法(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - RSA 加密算法(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 构成的正方形数量(2023.Q1) 【华为OD机试模拟…

计算机组成原理考研题精选

运算 1 D状态寄存器of,cf,sf,zf看结果&#xff0c;数据总线传输数据&#xff0c;Alu是核心器件&#xff0c;地址寄存器是存储器件 2 (74条消息) 【细碎知识1】浮点数的规格化_SinHao22的博客-CSDN博客_浮点数规格化 (74条消息) IEEE754 浮点数&#xff1a;简读案例秒懂_theR…

数据结构之8种排序算法

文章目录1.插入排序2.希尔排序&#xff1a;3.冒泡排序4.快速排序5.简单选择排序6.堆排序在堆中插入新元素&#xff1a;在堆中删除一个元素&#xff1a;7.归并排序8.基数排序9.外部排序排序算法1.插入排序 每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子序列中…

量子态操作:基于门的三态旋转

R-旋转操作 在量子计算中&#xff0c;RX, RY, RZ门是三种基本的单量子比特旋转门&#xff0c;它们分别绕X轴、Y轴、Z轴旋转量子比特的态矢量。 RX旋转门&#xff1a;绕X轴旋转角度为θ\thetaθ的RX门的矩阵表示为&#xff1a; Rx(θ)(cosθ2−isinθ2−isinθ2cosθ2)R_x(\th…

Python3+Selenium3自动化测试

此前对网页内容进行元素定位的操作&#xff0c;接下来就可以对已经定位的元素进行操作了&#xff0c;一般情况下定位好元素后通过IDE的提示就可以了解到有哪些方法 #coding utf-8 import time from selenium import webdriver from selenium.webdriver.common.by import By dr…

JAVA多线程牌号系统开发与应用

技术&#xff1a;Java等摘要&#xff1a;牌号系统是为解决一些服务业营业大厅排队问题而设计的&#xff0c;它能够有效地提高工作人员的工作效率&#xff0c;也能够使顾客合理的安排等待时间&#xff0c;让顾客感到服务的公平公正。论文首先讨论了牌号系统的背景、意义、应用现…

力扣-订单最多的客户

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;586. 订单最多的客户二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总…

算法模板总结(自用)

算法模板总结滑动窗口双指针算法数组相关合并两个有序数组左右指针技巧快慢指针技巧字符串相关左右指针反转字符串问题快慢指针替换空格字符问题链表相关快慢双指针删除链表的倒数第N个节点链表相交环形链表链表操作几数之和两数之和四个数组的四数之和三数之和同一数组中四数之…

(十)守恒律(主平衡原理)

守恒律表示了物体中某些物理场量之间的关系&#xff0c;它可表述为&#xff1a;某一时刻 ttt&#xff0c;对于物理场量 Φ\bold\PhiΦ 在物体体积 vvv 上的物质积分&#xff0c;其时间变化率等于另一物理场量 Ψ\bold\PsiΨ(源) 在该体积上的物质积分&#xff0c;与通过物体表面…

AI高效学习路径总结

最近chatgpt爆红&#xff0c;百度近日也官宣了大模型新项目“文心一言”&#xff08;英文名ERNIE Bot&#xff09;&#xff0c;即将在今年3月面向公众开放&#xff0c;我先期待一波&#xff0c;到时候给同学们说说感受。 这也不是第一次人工智能引起广泛关注了&#xff0c;随着…

外贸人员如何让远程办公和在办公室一样办公

俗话说&#xff1a;“工欲善其事&#xff0c;必先利其器”。作为外贸人员&#xff0c;常用的工具主要分为三大类&#xff1a;客户管理工具、翻译工具、邮箱工具。往往外贸人员会忽略另一类工具&#xff1a;远程类工具。客户管理工具 有了客户管理工具&#xff0c;企业和员工都可…

软件测试之正交法

正交法 通过分析我们发现,对于图中的程序而言,我们要设计81条测试用例,那么有没有一种方法能够使用最小的测试过程集合获得最大的测试覆盖率呢? 1. 概述 1.1 定义 正交法,也叫正交实验法或者正交排列法, 就是使用最小的测试过程集合获得最大的测试覆盖率。 “正交实验”是…