【SpringBoot笔记12】SpringBoot框架实现文件上传和文件下载

news/2024/5/20 23:51:49/文章来源:https://blog.csdn.net/qq_39826207/article/details/127503456

这篇文章,主要介绍如何使用SpringBoot框架实现文件上传和文件下载。

目录

一、SpringBoot文件上传

1.1、引入依赖

1.2、编写文件上传页面

1.3、编写文件上传代码

(1)MultipartFile对象

(2)ResourceUtils工具类

1.4、运行测试

1.5、配置文件上传属性

二、SpringBoot文件下载

2.1、编写文件下载页面

2.2、编写文件下载代码

2.3、运行测试

三、文件上传下载完整代码

3.1、完整控制器代码


一、SpringBoot文件上传

SpringBoot文件上传和下载,还是使用的SpringMVC框架中的,只不过SpringBoot给我们做了简化,它提供了一些文件上传的配置属性,例如:设置单个文件上传大小、单个请求最大上传文件大小、是否支持多文件上传等。下面介绍如何在SpringBoot框架中实现文件上传。

1.1、引入依赖

要实现文件上传功能,只需要引入【spring-boot-starter-parent】、【spring-boot-starter-web】依赖即可(web依赖里面已经包含了文件上传所需的jar包)。因为要编写文件上传界面,所以这里引入【spring-boot-starter-thymeleaf】依赖作为前端视图组件。

<!-- 引入 SpringBoot 父工程依赖 -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.0.RELEASE</version>
</parent><!-- 引入 web 工程依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入 thymeleaf 依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

1.2、编写文件上传页面

在【templates】目录下面,新建【index.html】页面,编写文件上传表单界面。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>文件上传下载</title>
</head>
<body><h3>文件上传</h3><form action="/api/upload" method="post" enctype="multipart/form-data">请选择文件:<input type="file" name="file"/><input type="submit" value="上传文件"></form>
</body>
</html>

1.3、编写文件上传代码

(1)MultipartFile对象

SpringBoot后,文件上传核心就是利用【MultipartFile】对象,我们只需要在上传方法参数里面使用这个参数对象,SpringBoot就自动会将上传的文件信息保存到这个MultipartFile对象里面,之后开发人员只需要调用该对象的方法进行各种操作即可完成文件的上传。

package com.spring.boot.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import java.io.File;/*** @author ZhuYouBin* @version 1.0.0* @Date: 2022/10/25 12:29* @Description*/
@Controller
@RequestMapping("/api")
public class FileUploadController {@GetMapping("/index")public String index() {return "index";}@PostMapping("/upload")@ResponseBodypublic String upload(MultipartFile file) {try {// 获取文件名称String originalFilename = file.getOriginalFilename();// 获取文件上传的目录路径// 获取 classpath 类路径String path = ResourceUtils.getURL("classpath:").getPath();// 将文件上传到 【classpath:/static/files】目录下面path += "/static/files/";// 创建 File 文件目录对象File filePath = new File(path);// 判断文件目录是否存在if (!filePath.exists()) {// 目录不存在, 则创建目录filePath.mkdirs();}// 创建上传之后的文件全路径名称File uploadPath = new File(filePath, originalFilename);// 上传文件file.transferTo(uploadPath);} catch (Exception e) {e.printStackTrace();return "文件上传失败";}return "文件上传成功";}}

(2)ResourceUtils工具类

Spring中提供了一个ResourceUtils工具类,这个工具类可以获取到资源相关信息,例如:获取classpath类路径。

// 获取 classpath 类路径
String path = ResourceUtils.getURL("classpath:").getPath();

1.4、运行测试

启动工程,访问【http://localhost:8080/api/index】文件上传页面,选择上传的文件,点击上传按钮,就可以看到文件上传成功成功。

查看工程目录里面的【target】目录,在这个目录下面,可以找到我们上传之后的文件,如下图所示。

1.5、配置文件上传属性

SpringBoot提供了几个文件上传的配置属性,主要有下面三个:

# 文件上传 相关配置
spring:servlet:multipart:enabled: true # 是否开启多文件上传max-request-size: 100MB # 单个请求最大上传文件大小,默认10MB(不写单位,默认单位是字节)max-file-size: 10MB # 单个文件最大上传大小,默认1MB(不写单位,默认单位是字节)

通过配置上面三个属性,当上传的文件过大时候,此时SpringBoot框架将会抛出异常,例如下面所示:

org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException:The field file exceeds its maximum permitted size of 10 bytes.

大致含义就是,上传的文件大小超过了配置的文件大小。

二、SpringBoot文件下载

SpringBoot实现文件下载,其实是利用HTTP的Response对象实现的,通过设置Response对象的Header相关属性,从而实现文件的下载。

2.1、编写文件下载页面

这里是通过超链接的方式实现文件的下载。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>文件上传下载</title>
</head>
<body><h3>文件上传</h3><form action="/api/upload" method="post" enctype="multipart/form-data">请选择文件:<input type="file" name="file"/><input type="submit" value="上传文件"></form><h3>文件下载</h3><a href="/api/download?filename=2020-12-13_080921.png">2020-12-13_080921.png</a> <br><a href="/api/download?filename=SpringMVC上传文件.docx">SpringMVC上传文件.docx</a>
</body>
</html>

2.2、编写文件下载代码

@GetMapping("/download")
@ResponseBody
public String download(String filename, HttpServletResponse response) {try {// 读取文件String path = ResourceUtils.getURL("classpath:").getPath();path += "/static/files/" + filename;// 创建文件对象File file = new File(path);// 将文件以输入流的形式读取FileInputStream fis = new FileInputStream(file);// 获取缓冲字符集BufferedReader reader = new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8));// 设置 response 响应头 等信息response.reset(); // 垂直响应流// 设置响应类型是:流response.setHeader("content-type", "application/octet-stream");// 设置响应内容位置, 这里是以附件的形式响应给客户端// 这里需要通过 URLEncoder 进行编码,否则中文名称会乱码response.setHeader("content-disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));// 设置响应字符集response.setCharacterEncoding("UTF-8");// 获取输出流对象PrintWriter out = response.getWriter();// 从输入流读取数据,通过输出流响应给浏览器String line;while ((line = reader.readLine()) != null) {out.write(line);}// 响应结束,关闭流fis.close();out.close();} catch (Exception e) {e.printStackTrace();return "文件下载失败";}return "文件下载成功";
}

2.3、运行测试

启动工程,访问文件上传下载,点击文件下载的超链接,就可以完成文件的下载功能。

三、文件上传下载完整代码

3.1、完整控制器代码

package com.spring.boot.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.StandardCharsets;/*** @author ZhuYouBin* @version 1.0.0* @Date: 2022/10/25 12:29* @Description*/
@Controller
@RequestMapping("/api")
public class FileUploadController {@GetMapping("/index")public String index() {return "index";}@PostMapping("/upload")@ResponseBodypublic String upload(MultipartFile file) {try {// 获取文件名称String originalFilename = file.getOriginalFilename();// 获取文件上传的目录路径// 获取 classpath 类路径String path = ResourceUtils.getURL("classpath:").getPath();// 将文件上传到 【classpath:/static/files】目录下面path += "/static/files/";// 创建 File 文件目录对象File filePath = new File(path);// 判断文件目录是否存在if (!filePath.exists()) {// 目录不存在, 则创建目录filePath.mkdirs();}// 创建上传之后的文件全路径名称File uploadPath = new File(filePath, originalFilename);// 上传文件file.transferTo(uploadPath);} catch (Exception e) {e.printStackTrace();return "文件上传失败";}return "文件上传成功";}@GetMapping("/download")@ResponseBodypublic String download(String filename, HttpServletResponse response) {try {// 读取文件String path = ResourceUtils.getURL("classpath:").getPath();path += "/static/files/" + filename;// 创建文件对象File file = new File(path);// 将文件以输入流的形式读取FileInputStream fis = new FileInputStream(file);// 获取缓冲字符集BufferedReader reader = new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8));// 设置 response 响应头 等信息response.reset(); // 垂直响应流// 设置响应类型是:流response.setHeader("content-type", "application/octet-stream");// 设置响应内容位置, 这里是以附件的形式响应给客户端// 这里需要通过 URLEncoder 进行编码,否则中文名称会乱码response.setHeader("content-disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));// 设置响应字符集response.setCharacterEncoding("UTF-8");// 获取输出流对象PrintWriter out = response.getWriter();// 从输入流读取数据,通过输出流响应给浏览器String line;while ((line = reader.readLine()) != null) {out.write(line);}// 响应结束,关闭流fis.close();out.close();} catch (Exception e) {e.printStackTrace();return "文件下载失败";}return "文件下载成功";}}

到此,SpringBoot框架实现文件的上传和下载就成功啦。

综上,这篇文章结束了,主要介绍如何使用SpringBoot框架实现文件上传和文件下载。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音频拼接在一起怎么做?这篇文章来告诉你

随着互联网的发展&#xff0c;很多优质歌曲都纷纷地呈现在大家眼前&#xff0c;而将不同的音乐合并在一起&#xff0c;并且放入视频里&#xff0c;也是别有一番风味&#xff0c;那么许多人会好奇音频如何拼接在一起呢?下面就为大家分享两个好用的方法&#xff0c;只要一点时间…

【C++】使用对象自动管理指针(用到运算符重载)

文章目录1. 首先设计整型类&#xff1a;class Int普通指针2. 设计一个Object类&#xff0c;并设计Int类型的指针。那如何获取Int类型的值呢&#xff1f;1. 首先设计整型类&#xff1a;class Int class Int { private:int value; public:Int(int x 0) :value(x){cout <<…

Springbootg整合validation整合

坚持年年写博客&#xff0c;不能断了&#xff0c;所以粘贴平时写的一份笔记吧 一、简介 校验参数在以前基本都是使用大量的if/else&#xff0c;稍微方便一点的可以使用反射自定义注解的形式&#xff0c;但是复用性不是很好&#xff0c;并且每个人对于的自定义注解有着自己的使…

Java基础-任务执行服务

今天小编带领大家一起来探索Java中的任务执行服务 关于任务执行服务&#xff0c;我们介绍了&#xff1a; 任务执行服务的基本概念。 主要实现方式&#xff1a;线程池。 定时任务。 &#xff08;1&#xff09;基本概念 任务执行服务大大简化了执行异步任务所需的开发&…

算法 - 最少交换次数来组合所有的 1 II

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 2134. 最少交换次数来组合所有的 1 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 交换定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。 环形数组是一个数组&#xff0c;可以认为 第…

第五章:乱序执行

1.概念 指令在执行时常常因为一些限制而等待。例如&#xff0c;MEM单元访问的数据不在cache中,需要从外部存储器中取&#xff0c;这个过程通常需要几十、几百个Cycle&#xff0c;如果是顺序执行的内核,后面的指令都要等待&#xff0c;而如果处理器足够智能&#xff0c;就可以先…

修改数组(秋季每日一题 31)

给定一个长度为 nnn 的正整数数组 a1,a2,…,ana_1,a_2,…,a_na1​,a2​,…,an​。 你可以任意改变其中任意元素的值。 但是&#xff0c;改变后的元素的值仍需是正整数。 将一个元素的值从 aaa 变为 bbb 所需要付出的代价为 ∣a−b∣|a−b|∣a−b∣。 对于一个正整数 ttt&am…

Elasticsearch 查询详解

1 数据准备 PUT student_index {"settings": {"number_of_shards": 1,"number_of_replicas": 0},"mappings": {"properties": {"birthday": {"type": "date","format": "yyy…

AcmHelper -运行在本地的Acm帮手

AcmHelper 详见github 本地环境下的 Polygon , 但不止于 Polygon. 你可以 快速创建具有合理结构的题目文件夹指定 std , checker , validator , interactor使用不同语言完成不同部分 (cpp/py)使用额外的程序来测试数据的质量使用预制的数据生成器快速生成具有某些特征的数据…

Python爬虫|采集开源众包的悬赏任务,自动翻页

前言 现在互联网,有很多网站提供一些接单外派的形式,提供给有能力的人或者团队去接单。比如说,很多人熟悉的猪八戒,程序员客栈,CODING 码市,开源众包等等平台,相信很多同学也都知道。 如果要第一时间了解某个接单平台发布的第一手悬赏任务,选择爬虫也是非常不错的选择…

【路径规划】一种考虑COLREGs人工势场的船舶运动规划算法研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

羧酸修饰Ag2S硫化银量子点,Ag2Se硒化银量子点,Ag2Te碲化银量子点,InP磷化铟量子点

羧酸修饰Ag2S硫化银量子点,Ag2Se硒化银量子点,Ag2Te碲化银量子点,InP磷化铟量子点 羧酸修饰Ag2S硫化银量子点 液一液界面制备近红外荧光Ag2S量子点 Ag:S量子点的制备过程如示意图2A和2B所示,通过向搅拌的硫前体水溶液中快速注人银前体油溶液,反应体系将迅速乳化形成大量液滴…

视频背景不好看?想要给视频里的人物抠出来换背景?教你轻松实现

我们经常能在抖音或者其他短视频平台上看见一些视频背景是经过抠换的&#xff0c;比较常见的是一些舞蹈视频&#xff0c;通过背景抠换&#xff0c;把原本平平无奇的背景换成了灯光特效&#xff0c;这就瞬间变得吸引人眼球了&#xff0c;视频也会变得更加具有特点。如果你也想发…

vlan高级特性super vlan

vlan高级特性super vlan vlan aggregation&#xff0c;vlan的聚合&#xff0c;聚合的目的是减少ip地址的浪费 正常情况将不同的vlan划分到不同的网段&#xff0c; 比如&#xff1a;vlan10–>192.168.1.0/24&#xff0c;vlan20—>192.168.2.0/24 但是如果一个网段只用了…

代码随想录动态规划——一和零

题目 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的大小&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 示例 1&#xff1a; 输入&#xff1a;strs [“10…

神州数码面试

集合相关 集合用过吗&#xff1f;全部都说一下&#xff1f; 我主要从以下方面回答&#xff1a; 底层结构、如何用、何时用、哪个更合适、是否线程安全&#xff1f; HashMap允许空值吗&#xff1f;线程相关 sleep和wait区别&#xff08;被问3次&#xff09; 共享锁什么意思&am…

NLP算法-关键词提取之LSA / LSI 算法

Gensim工具包引入Gensim简介一些基础概念Gensim的使用方式1、 训练语料的预处理2、主题向量的变换LDA模型 demoLSA/LSI 算法LSA/LSI算法原理LSA/LSI 算法步骤LSA/:SI优缺点LSA/LSI算法 demo引入 书接上回&#xff0c;我们讲到关键词提取中的TF-IDF算法 我们接着讲基于主题模型…

Django+Celery框架自动化定时任务开发

** 本章介绍使用DjCelery即DjangoCelery框架开发定时任务功能&#xff0c;在Autotestplat平台上实现单一接口自动化测试脚本、业务场景接口自动化测试脚本、App自动化测试脚本、Web自动化测试脚本等任务的定时执行、调度、管理等&#xff0c;从而取代Jenkins上的定时执行脚本和…

【附源码】计算机毕业设计SSM校园论坛

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于matlab的史密斯圆图演示仿真图

目录 1.算法概述 2.部分程序 3.算法部分仿真结果图 4.完整程序获取 1.算法概述 史密斯图表(Smith chart&#xff0c;又称史密斯圆图)是在反射系散平面上标绘有归一化输入阻抗&#xff08;或导纳&#xff09;等值圆族的计算图。是一款用于电机与电子工程学的图表&#xff0c…