Springboot 一行代码实现文件上传 20个平台!少写代码到极致
大家好,我是小富~
技术交流,公众号:程序员小富
又是做好人好事的一天,有个小可爱私下问我有没有好用的springboot
文件上传工具,这不巧了嘛,正好我私藏了一个好东西,顺便给小伙伴们也分享一下,demo地址放在文末了。
文件上传在平常不过的一个功能,做后端开发的基本都会接触到,虽然不难可着实有点繁琐。数据流的开闭、读取还容易出错,尤其是在对接一些OSS
对象存储平台,一个平台一堆SDK代码看起来乱糟糟的。
下边给我大家推荐一个工具Spring File Storage
,上传文件只要些许配置一行代码搞定,开发效率杠杠的,一起看看是不是有这么流批!
Spring File Storage
工具几乎整合了市面上所有的OSS对象存储平台,包括本地
、FTP
、SFTP
、WebDAV
、阿里云OSS
、华为云OBS
、七牛云Kodo
、腾讯云COS
、百度云 BOS
、又拍云USS
、MinIO
、京东云 OSS
、网易数帆 NOS
等其它兼容 S3 协议的平台,只要在springboot中通过极简的方式就可以实现文件存储。
简单配置
下边以本地和Aliyun OSS上传为例,pom.xml
中引入必要的spring-file-storage.jar
,注意: 如果要上传文件到OSS平台,需要引入对应平台的SDK包。
<!-- spring-file-storage 必须要引入 --> <dependency> <groupId>cn.xuyanwu</groupId> <artifactId>spring-file-storage</artifactId> <version>0.5.0</version> </dependency> <!-- 阿里云oss --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency>
application.yml
文件中配置些基础信息。
enable-storage
:只有状态开启才会被识别到default-platform
:默认的上传平台domain
:生成的文件url中访问的域名base-path
:存储地址thumbnail-suffix
:缩略图后缀
要是上传OSS对象存储平台,将aliyun oss
提供的变量配置到相应的模块上即可。
spring: #文件存储配置(本地、oss) file-storage: default-platform: local-1 thumbnail-suffix: ".min.jpg" #缩略图后缀 local: - platform: local-1 # 存储平台标识 enable-storage: true #是否开启本存储(只能选一种) enable-access: true #启用访问(线上请使用 Nginx 配置,效率更高) domain: "http://127.0.0.1:2222" #访问域名,注意后面要和path-patterns保持一致,“/”结尾 base-path: /tmp/Pictures/ # 存储地址 path-patterns: /** #访问路径 aliyun-oss: - platform: aliyun-oss enable-storage: true access-key: xxxx secret-key: xxxx end-point: xxx bucket-name: firebook domain: http://fire100.top base-path: #云平台文件路径
springboot
启动类中增加注解@EnableFileStorage
,显式的开启文件上传功能,到这就可以用了
@EnableFileStorage // 文件上传工具 @SpringBootApplication public class SpringbootFileStorageApplication { public static void main(String[] args) { SpringApplication.run(SpringbootFileStorageApplication.class, args); } }
上传文件
接下来在业务类中引入FileStorageService
服务,如下只要一行代码就可以完成文件上传,是不是So easy,下载也是如法炮制。
@RestController public class FileController { @Autowired private FileStorageService fileStorageService; /** * 公众号:程序员小富 * 上传文件 */ @PostMapping(value = {"/upload"}) public Object upload(MultipartFile file) { FileInfo upload = fileStorageService.of(file).upload(); return upload; } }
我们用postman
测试上传一张图片,看到图片已经成功传到了/tmp/Pictures
目录下,返回结果中包含了完整的访问文件的URL路径。
不仅如此spring-file-storage
还支持多种文件形式,URI
、URL
、String
、byte[]
、InputStream
、MultipartFile
,使开发更加灵活。
文件上传功能,更多时候我们都是在上传图片,那就会有动态裁剪图片
、生成缩略图
的需求,这些 spring-file-storage 都可以很容易实现。
/** * 公众号:程序员小富 * 上传图片裁剪大小并生成一张缩略图 */ @PostMapping("/uploadThumbnail") public FileInfo uploadThumbnail(MultipartFile file) { return fileStorageService.of(file) .image(img -> img.size(1000,1000)) //将图片大小调整到 1000*1000 .thumbnail(th -> th.size(200,200)) //再生成一张 200*200 的缩略图 .upload(); }
而且我们还可以动态选择上传平台,配置文件中将所有平台开启,在实际使用中自由的选择。
/** * 公众号:程序员小富 * 上传文件到指定存储平台,成功返回文件信息 */ @PostMapping("/upload-platform") public FileInfo uploadPlatform(MultipartFile file) { return fileStorageService.of(file) .setPlatform("aliyun-oss") //使用指定的存储平台 .upload(); }
下载文件
下载文件也同样的简单,可以直接根据文件url或者文件流下载。
/** * 公众号:程序员小富 * 下载文件 */ @PostMapping("/download") public void download(MultipartFile file) { // 获取文件信息 FileInfo fileInfo = fileStorageService.getFileInfoByUrl("http://file.abc.com/test/a.jpg"); // 下载到文件 fileStorageService.download(fileInfo).file("C:\\a.jpg"); // 直接通过文件信息中的 url 下载,省去手动查询文件信息记录的过程 fileStorageService.download("http://file.abc.com/test/a.jpg").file("C:\\a.jpg"); // 下载缩略图 fileStorageService.downloadTh(fileInfo).file("C:\\th.jpg"); }
提供了监听下载进度的功能,可以清晰明了的掌握文件的下载情况。
// 下载文件 显示进度 fileStorageService.download(fileInfo).setProgressMonitor(new ProgressListener() { @Override public void start() { System.out.println("下载开始"); } @Override public void progress(long progressSize,long allSize) { System.out.println("已下载 " + progressSize + " 总大小" + allSize); } @Override public void finish() { System.out.println("下载结束"); } }).file("C:\\a.jpg");
文件存在、删除
我们还可以根据文件的URL地址来判断文件是否存在、以及删除文件。
//直接通过文件信息中的 url 删除,省去手动查询文件信息记录的过程 fileStorageService.delete("http://file.abc.com/test/a.jpg");
//直接通过文件信息中的 url 判断文件是否存在,省去手动查询文件信息记录的过程 boolean exists2 = fileStorageService.exists("http://file.abc.com/test/a.jpg");
切面
工具还提供了每种操作的切面,可以在每个动作的前后进行干预,比如打日志或者玩点花活,实现FileStorageAspect
类重写对应动作的xxxAround方法。
** * 使用切面打印文件上传和删除的日志 */ @Slf4j @Component public class LogFileStorageAspect implements FileStorageAspect { /** * 上传,成功返回文件信息,失败返回 null */ @Override public FileInfo uploadAround(UploadAspectChain chain, FileInfo fileInfo, UploadPretreatment pre, FileStorage fileStorage, FileRecorder fileRecorder) { log.info("上传文件 before -> {}",fileInfo); fileInfo = chain.next(fileInfo,pre,fileStorage,fileRecorder); log.info("上传文件 after -> {}",fileInfo); return fileInfo; } }
demo案例地址:https://github.com/chengxy-nds/Springboot-Notebook/tree/master/springboot-file-storage
总结
用了这个工具确实极大的减少了上传文件所带来的代码量,提升了开发效率,使用过程中暂未发现有什么坑,好东西就是要大家分享,如果符合你的需求,犹豫什么用起来吧。
技术交流,公众号:程序员小富

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
开一场高价值的迭代回顾会,少不了这一招!
观点共创 | 潮海项目教练 撰文编辑 | LigaAI 敏捷团队在迭代评审会(Sprint Review)中展示和评估产品增量,并调整待办列表;随后,在迭代回顾会(Sprint Retrospective)上,聚焦开发与发布全过程,讨论有关工作和协作的优化方案,以改善开发过程、提高开发质量。 释放有效沟通,鼓励畅所欲言。迭代回顾会通过分析流程和协作中存在或潜在的缺陷,帮助团队识别和解决冲突,是实现迭代提升和增补动力的最佳实践,也是不可或缺的重要敏捷环节。 但在真正的落地与实践中,许多团队总会因为成员参与度低、内容空泛不聚焦、气氛压抑流于形式等挑战,最终放弃会议。如何让含蓄内敛的成员发声,言之有物地参与到迭代优化的建设中,困扰着每个回顾会失意的敏捷团队。 其中,构建安全场域,赋予全员安全感是激发自主表达的第一步,也是最容易被忽视的关键技巧。 一、什么是安全场域? 场域(Field)一词起源于物理学,后成为社会学的重要概念之一。布迪厄将场域定义为「位置间客观关系的一个网络或一个形构」。 它不是由一定边界物包围的领地,也不等同于一般领域,而是有内含力量的、有生气的、有潜力的、相对独立的社会空...
- 下一篇
字节跳动 kube-apiserver 高可用方案 KubeGateway
KubeGateway 是字节跳动针对 kube-apiserver 流量特征专门定制的七层网关,它彻底解决了 kube-apiserver 负载不均衡的问题,同时在社区范围内首次实现了对 kube-apiserver 请求的完整治理,包括请求路由、分流、限流、降级等,显著提高了 Kubernetes 集群的可用性。 项目地址:https://github.com/kubewharf/kubegateway 为什么要自研 KubeGateway 在 Kubernetes 集群中,kube-apiserver 是整个集群的入口,任何用户或者程序对集群资源的增删改查操作都需要经过 kube-apiserver,因此它的高可用性决定了整个集群的高可用能力。kube-apiserver 本质上是一个无状态的服务器,为了实现其高可用,开发人员通常会部署多个 kube-apiserver 实例,同时引入外部负载均衡器(以下简称 LB)进行流量代理。 为了保证集群的安全,kube-apiserver 对请求进行认证和授权的准入控制,其中认证是为了识别出用户的身份。 Kubernetes 支持多种认证...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装Nodejs环境