又是做好人好事的一天,有个小可爱私下问我有没有好用的springboot文件上传工具,这不巧了嘛,正好我私藏了一个好东西,顺便给小伙伴们也分享一下,demo地址放在文末了。

文件上传在平常不过的一个功能,做后端开发的基本都会接触到,虽然不难可着实有点繁琐。数据流的开闭、读取还容易出错,尤其是在对接一些OSS对象存储平台,一个平台一堆SDK代码看起来乱糟糟的。

下边给我大家推荐一个工具Spring File Storage,上传文件只要些许配置一行代码搞定,开发效率杠杠的,一起看看是不是有这么流批!

官网:spring-file-storage.xuyanwu.cn

Spring File Storage工具几乎整合了市面上所有的OSS对象存储平台,包括本地FTPSFTPWebDAV阿里云OSS华为云OBS七牛云Kodo腾讯云COS百度云 BOS又拍云USSMinIO京东云 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-1thumbnail-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-ossenable-storage: trueaccess-key: xxxxsecret-key: xxxxend-point: xxxbucket-name: firebookdomain: http://fire100.topbase-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 {@Autowiredprivate 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还支持多种文件形式,URIURLStringbyte[]InputStreamMultipartFile,使开发更加灵活。

文件上传功能,更多时候我们都是在上传图片,那就会有动态裁剪图片生成缩略图的需求,这些 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() {@Overridepublic void start() {System.out.println("下载开始");}@Overridepublic void progress(long progressSize,long allSize) {System.out.println("已下载 " + progressSize + " 总大小" + allSize);}@Overridepublic 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*/@Overridepublic 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案例地址:github.com/chengxy-nds…

总结

用了这个工具确实极大的减少了上传文件所带来的代码量,提升了开发效率,使用过程中暂未发现有什么坑,好东西就是要大家分享,如果符合你的需求,犹豫什么用起来吧。

Springboot 一行代码实现文件上传 20个平台、少写代码到极致相关推荐

  1. php上传文件测试代码,php 文件上传函数的超详细示例

    这篇文章主要为大家详细介绍了php 文件上传函数的超详细示例,具有一定的参考价值,可以用来参考一下. 下面跟随512笔记的小编来举个例子吧. 经测试代码如下: /** * 文件上传 * * 返回的数组 ...

  2. Win10搭建FTP服务器+java代码实现文件上传至FTP服务器

    Win10搭建ftp服务器 打开控制面板 -> 程序和功能,点击启用或关闭Windows功能,勾选红色方框内的选项 控制面板 -> 管理工具,如下打开IIS管理器 先在本地磁盘中创建一个目 ...

  3. 代码审计:YCCMS 代码执行 文件上传 任意文件删除

    代码审计:YCCMS 代码执行 文件上传 任意文件删除 YCCMS 审计准备 代码审计 代码执行漏洞 文件上传漏洞 任意文件删除漏洞 YCCMS YCCMS是一款PHP版轻量级CMS建站系统,程序页面 ...

  4. windows文件上传到linux平台乱码的解决办法

    windows文件上传到linux平台乱码的解决办法 1.首先在windows上,使用ConvertZ工具,把文件名称(不是文件内容)转码,例如GBK换成Unicode 简体 2.然后上传到linux ...

  5. 除了文件上传还有哪些方式可以写一句话木马?

    除了文件上传还有哪些方式可以写一句话木马? 一句话木马如果上传到服务器的话,有啥危害学过网络安全的人都知道.但是通常网上流传的方式都是通过文件上传来实现木马上传,实在太过老套,这里就教大家几个新的方式 ...

  6. springboot 上传图片大小_springboot 文件上传大小配置的方法

    springboot上传文件大小的配置我这里记录两种,一种是设置在配置文件里只有两行代码,一种是加个Bean 首先第一种: application.properties中添加 spring.http. ...

  7. Springboot+thymeleaf实现excel文件上传+后台数据搜索

    废话不多说,直接上代码 先说excel文件上传 用的是poi框架 先贴maven配置 <!-- poi导入excel文件--><dependency><groupId&g ...

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

    介绍 这里是小编成长之路的历程,也是小编的学习之路.希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡. 一个人为什么要努力? ...

  9. SpringBoot+Vue+ElementUI实现文件上传与文件下载

    作者: Memory(星哥) Wechat:/QQ: 574373426 整理不易,感谢支持,欢迎 收藏 转发 分享 专注IT职业教育多年,学编程找星哥 SpringBoot+Vue+ElementU ...

最新文章

  1. 多天线技术是LTE的重要演进方向已成为产业共识
  2. Mapreuduce实现网络数据包的清洗工作
  3. mysql 8重置root密码_如何在MySQL 8中重置root密码
  4. QT_4_QpushButton的简单使用_对象树
  5. 文华软件登录显示请选择服务器,文华财经提示先登录云服务器
  6. 两端分散对齐怎么设置_Word文字很难对齐?用这4个方法,2秒可对齐所有文字!...
  7. startuml动态模型工具_动态面板模型估计方法简介以及stata应用
  8. Java 并发编程Semaphore的应用与源码解析
  9. 遍历字典_十三、Python字典三种遍历方法
  10. android关键应用程序,Android应用程序基础.pdf
  11. AI 时代,中国技术创新如何弯道超车?
  12. my04_Mysql复制数据一致性校验
  13. ue4 FString 中文乱码问题
  14. C++容器方法大汇总
  15. 如何用java判断进程是否假死_Spring Boot假死诊断实战记录
  16. 【ava数据集可视化】ava数据集ID可视化 A Video Dataset of Spatio-temporally Localized Atomic Visual Actions
  17. 【spring_Cloud】java.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud
  18. 医药计算机实验报告,医药管理系统实验报告.doc
  19. 优维CMDB又征服了一家国际零售巨头
  20. 服务器里搭建游戏玩家访问卡是什么原因

热门文章

  1. Unity播放视频插件EasyMovieTexture
  2. 4.17 将外部导入的普通文字转换为日期格式 [原创Excel教程]
  3. STM32配置看门狗
  4. 【智能零售】数据如何驱动新零售:线上单月 1.2 亿背后的数据化运营
  5. iOS 摸鱼周报 #54 | Apple 辅助功能持续创新
  6. 使用socket.io做一个简单的WEB聊天室
  7. GridView网格组件,实现疯狂猜图的首页选关功能
  8. Winform TextBox中只能输入数字的几种常用方法
  9. c# 如何让textbox 只能输入十六进制
  10. select语句如何过五关斩六将