springboot文件上传和下载接口的简单思路
springboot文件上传和下载的简单思路
- 文件上传
- 文件下载
文件上传
在springboot中,上传文件只需要在接口中通过 MultipartFile 对象来获取前端传递的数据,然后将数据存储,并且返回一个对外访问路径即可。一般对于上传文件的文件名,都要通过uuid进行处理。
@RestController
@RequestMapping("/file")
public class FileController {// 服务器存储位置private static String parentPath = "D:\\IdeaProjects\\demoZ\\src\\main\\resources\\static\\";// 上传接口@RequestMapping("/upload")public String uploadFile(@RequestParam MultipartFile file) throws IOException {String originalFilename = file.getOriginalFilename(); // 获取文件名String type = file.getContentType(); // 获取文件类型long size = file.getSize(); // 获取文件大小// 这里只对一种类型进行了简单判断,可以自行修改if ("image/jpeg".equals(type)){type = ".jpg";}// 构建uuid作为唯一标识String uuid = UUID.randomUUID().toString()+type;File uploadFile = new File(parentPath+uuid);// 判断父级目录是否存在,不存在则创建File parentFile = uploadFile.getParentFile();if(!parentFile.exists()){parentFile.mkdirs();}// 文件存储到磁盘上file.transferTo(uploadFile);// 返回对外访问路径return "http://localhost:9090/file/"+uuid;}
}
文件下载
文件下载的话,只需要在接口中传入文件的uuid名称,然后通过流的方式直接输出即可。
@RestController
@RequestMapping("/file")
public class FileController {private static String parentPath = "D:\\IdeaProjects\\demoZ\\src\\main\\resources\\static\\";// 文件上传接口....// 文件下载接口@RequestMapping("/{uuid}")public void download(@PathVariable String uuid, HttpServletResponse response) throws IOException {// 通过response将数据输出// 根据文件的唯一标识码获取文件File uploadFile = new File(parentPath+uuid);// 设置输出流的格式ServletOutputStream os = response.getOutputStream();response.addHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(uuid,"UTF-8"));response.setContentType("application/octet-stream");// 创建文件输入流FileInputStream fis = new FileInputStream(uploadFile);// 读取文件的字节流byte[] buf = new byte[1024];int readLen = 0;while ((readLen=fis.read(buf))!=-1){// 边读边写os.write(buf,0,readLen);}os.flush();os.close();}
}
tips:通过文件上传的返回值即可测试下载接口 http://localhost:9090/file/59038923-ea78-40df-970e-70f49dc966b3.jpg
这里的话,为了简单就只写了后端的文件上传和下载,没有涉及到数据库的文件信息存储,正常情况下是根据你文件的唯一标识去获取下载这张图片的url地址的。(不过接口写的没问题哈)
相关文章:

springboot文件上传和下载接口的简单思路
springboot文件上传和下载的简单思路 文件上传文件下载 文件上传 在springboot中,上传文件只需要在接口中通过 MultipartFile 对象来获取前端传递的数据,然后将数据存储,并且返回一个对外访问路径即可。一般对于上传文件的文件名,…...

MySQL索引和事务
目录 索引的作用 与 概念 MySQL有哪几种索引类型 如何提高查找效率 聚簇索引与非聚簇索引 覆盖索引 索引的优点和缺点 索引的一些基本操作 索引优化 B树、B树、Hash、红黑树的区别 B树与B树的区别 MySQL为什么使用B树作为索引 联合索引中的顺序 MySQL的最左前缀原…...
typeScript 之 基础
工具: PlayGround 源码: GitHub TypeScript 变量声明 typeScript中变量声明注意: 开头不能以数字开头变量名称可以包含数字和字母除了下划线_和美元$符号外,不能包含其他任意特殊字符 声明的结构: let 变量名: 类型…...

android app控制ros机器人五(百度地图)
半吊子改安卓,新增了标签页,此标签页需要显示百度地图 按照官方教程注册信息,得到访问应用AK,步骤也可以参照下面csdn Android地图SDK | 百度地图API SDK 【Android】实现百度地图显示_宾有为的博客-CSDN博客 本人使用的是aar开…...

【ts】【cocos creator】excel表格转JSON
需要将表格导出为text格式放到项目resources/text文件夹下 新建场景,挂载到Canvas上运行 表格文件格式: 保存格式选text tableToJson : import CryptoJS require(./FileSaver);const { ccclass, property } cc._decorator;ccclass export default c…...
每天一个知识点——L2R
面试的时候,虽然做过医疗文献搜索,也应用过L2R的相关模型,但涉及到其中的一些技术细节,都会成为我拿不下offer永远的痛。也尝试过去理解去背下一些知识点,终究没有力透纸背,随着时间又开始变得模糊…...
解决flutter showDialog下拉框,复选框等无法及时响应的问题
使用StatefulBuilder _showDialogr() {showDialog(context: context,builder: (BuildContext ctx) {return StatefulBuilder(builder: (BuildContext context, StateSetter setState) {return Scaffold(body: Column(children: <Widget>[Container(height: 400,padding: …...

[C++ 网络协议编程] UDP协议
目录 1. UDP和TCP的区别 2. UDP的工作原理 3. UDP存在数据边界 4. UDP的I/O函数 4.1 sendto函数 4.2 recvfrom函数 4. 已连接(connected)UDP套接字和未连接(unconnected)UDP套接字 5. UDP的通信流程 5.1 服务器端通信流程 5.2 客户端通信流程 1. UDP和TCP的区别 主要…...
reactNative跳转appstore链接报错:Redirection to URL with a scheme that is not HTTP(S)
在reactnative中webview跳转H5下载页面,包错Redirection to URL with a scheme that is not HTTP(S) 在webview中添加一下代码 const onShouldStartLoadWithRequest (event: any) > {const { url } event;console.log(url);if (url.startsWith(https://itune…...

html css实现爱心
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 爱心 */.lo…...
react中使用shouldComponentUpdate生命周期函数调用setState引起的无限循环的错误
场景: 在 React 组件中,当在 componentWillUpdate 或 componentDidUpdate 生命周期方法中调用 setState 时,会触发无限循环,导致超过最大更新深度。 错误原因 在React组件中 ,我们使用componentWillUpdate 或 componen…...

麦肯锡发布《2023科技趋势展望报告》,生成式AI、下一代软件开发成为趋势,软件测试如何贴合趋势?
近日,麦肯锡公司发布了《2023科技趋势展望报告》。报告列出了15个趋势,并把他们分为5大类,人工智能革命、构建数字未来、计算和连接的前沿、尖端工程技术和可持续发展。 类别一:人工智能革命 生成式AI 生成型人工智能标志着人工智…...

【爬虫】P1 对目标网站的背景调研(robot.txt,advanced_search,builtwith,whois)
对目标网站的背景调研 检查 robot.txt估算网站大小识别网站所用技术寻找网站的所有者 检查 robot.txt 目的: 大多数的网站都会包含 robot.txt 文件。该文件用于指出使用爬虫爬取网站时有哪些限制。而我们通过读 robot.txt 文件,亦可以最小化爬虫被封禁的…...

maven如何建立JavaWeb项目并连接数据库,验证登录
这里是建立建立web项目:Maven如何创建Java web项目(纯干货版)!!!_明天更新的博客-CSDN博客 我们主要演示如何连接数据库验证登录。 1.在webapp目录下创建我们的登录页面:index.jsp 还需要再…...

CVPR 2023 | 用户可控的条件图像到视频生成方法(基于Diffusion)
注1:本文系“计算机视觉/三维重建论文速递”系列之一,致力于简洁清晰完整地介绍、解读计算机视觉,特别是三维重建领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, NeurIPS, ICLR, ICML, TPAMI, IJCV 等)。 本次介绍的论…...

动态规划(基础)
一,背包问题 老规矩,上链接(http://t.csdn.cn/hEwvu) (1)01背包问题 给定一个承重量为C的背包,n个重量分别为w1,w2,...,wn的物品,物品i放入背包能产生pi(>0)的价值(i1,…...

【Pytorch:nn.Embedding】简介以及使用方法:用于生成固定数量的具有指定维度的嵌入向量embedding vector
文章目录 1、nn.Embedding2、使用场景 1、nn.Embedding 首先我们讲解一下关于嵌入向量embedding vector的概念 1)在自然语言处理NLP领域,是将单词、短语或其他文本单位映射到一个固定长度的实数向量空间中。嵌入向量具有较低的维度,通常在几…...
动态库的命名规则
1、动态库的命名规则:libname.so.x.y.z 名字含义lib这是共享库的前缀name共享库名字x主版本号y次版本号z发布版本号 2、每个版本号的含义 版本号含义主版本号表示库的重大升级,不同主版本号的库之间是不兼容的。依赖旧的主版本号的程序需要改动相应的…...
【Linux】网络---->网络理论
网络理论 网络协议分层模型网络数据的封装于分用地址管理 网络协议分层模型 OSI五层模型:应用层,传输层,网络层,数据链路层,物理层 应用层:主要负责应用程序间的沟通,代表协议有HTML协议&#x…...

Android学习之路(4) UI控件之输入框
本节引言: 在本节中,我们来学习第二个很常用的控件EditText(输入框); 和TextView非常类似,最大的区别是:EditText可以接受用户输入! 1.设置默认提示文本 如下图,相信你对于这种用户登录的界面并…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
GB/T 43887-2024 核级柔性石墨板材检测
核级柔性石墨板材是指以可膨胀石墨为原料、未经改性和增强、用于核工业的核级柔性石墨板材。 GB/T 43887-2024核级柔性石墨板材检测检测指标: 测试项目 测试标准 外观 GB/T 43887 尺寸偏差 GB/T 43887 化学成分 GB/T 43887 密度偏差 GB/T 43887 拉伸强度…...
PostgreSQL 对 IPv6 的支持情况
PostgreSQL 对 IPv6 的支持情况 PostgreSQL 全面支持 IPv6 网络协议,包括连接、存储和操作 IPv6 地址。以下是详细说明: 一、网络连接支持 1. 监听 IPv6 连接 在 postgresql.conf 中配置: listen_addresses 0.0.0.0,:: # 监听所有IPv4…...