大家好,我是小富~
又是做好人好事的一天,有个小可爱私下问我有没有好用的 springboot
文件上传工具,这不巧了嘛,正好我私藏了一个好货色,顺便给小伙伴们也分享一下,demo地址放在文末了。
文件上传在平时不过的一个性能,做后端开发的根本都会接触到,尽管不难可着实有点繁琐。数据流的开闭、读取还容易出错,尤其是在对接一些 OSS
对象存储平台,一个平台一堆 SDK 代码看起来乱哄哄的。
下边给我大家举荐一个工具 Spring File Storage
,上传文件只有些许配置 一行代码 搞定,开发效率杠杠的,一起看看是不是有这么流批!
官网:https://spring-file-storage.x…
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-nd…
总结
用了这个工具的确极大的缩小了上传文件所带来的代码量,晋升了开发效率,应用过程中暂未发现有什么坑,好货色就是要大家分享,如果合乎你的需要,犹豫什么用起来吧。
技术交换,公众号:程序员小富