咱们好,我是小富~
技术交流,公众号:程序员小富
又是做好人功德的一天,有个小可爱暗里问我有没有好用的springboot
文件上传东西,这不巧了嘛,正好我私藏了一个好东西,顺便给小伙伴们也共享一下,demo地址放在文末了。
文件上传在平常不过的一个功用,做后端开发的基本都会接触到,尽管不难可着实有点繁琐。数据流的开闭、读取还简单出错,尤其是在对接一些OSS
目标存储渠道,一个渠道一堆SDK代码看起来乱糟糟的。
下边给我咱们引荐一个东西Spring File Storage
,上传文件只需些许装备一行代码搞定,开发功率杠杠的,一同看看是不是有这么流批!
官网:spring-file-storage.xuyanwu.cn
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("");
// 下载到文件
fileStorageService.download(fileInfo).file("C:\\a.jpg");
// 直接经过文件信息中的 url 下载,省去手动查询文件信息记载的进程
fileStorageService.download("").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("");
//直接经过文件信息中的 url 判别文件是否存在,省去手动查询文件信息记载的进程
boolean exists2 = fileStorageService.exists("");
切面
东西还供给了每种操作的切面,能够在每个动作的前后进行干涉,比方打日志或者玩点花活,完结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案例地址:github.com/chengxy-nds…
总结
用了这个东西的确极大的减少了上传文件所带来的代码量,提升了开发功率,使用进程中暂未发现有什么坑,好东西便是要咱们共享,如果符合你的需求,犹豫什么用起来吧。
技术交流,公众号:程序员小富