# oss-spring-boot-starter
**Repository Path**: phubing/oss-spring-boot-starter
## Basic Information
- **Project Name**: oss-spring-boot-starter
- **Description**: 本工具集成了常用的第三方对象存储平台,简化项目中使用对象存储时繁琐的集成过程,并针对实际使用过程中的积累,对常用方法进行封装,提供了一套标准的API,让对象存储开箱即用。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 74
- **Created**: 2022-05-09
- **Last Updated**: 2022-05-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# OSS对象存储
本工具集成了常用的第三方对象存储平台,简化项目中使用对象存储时繁琐的集成过程,并针对实际使用过程中的积累,对常用方法进行封装,提供了一套标准的API,让对象存储开箱即用。
- 源码地址
[Github](https://github.com/ArtIsLong/oss-spring-boot-starter)
[Gitee](https://gitee.com/spring-boot-starter/oss-spring-boot-starter)
- 目前已支持:
[本地存储](https://hutool.cn/docs/#/core/IO/%E6%96%87%E4%BB%B6%E5%B7%A5%E5%85%B7%E7%B1%BB-FileUtil)
[FTP](https://commons.apache.org/proper/commons-net/download_net.cgi)
[SFTP](http://epaul.github.io/jsch-documentation/javadoc/com/jcraft/jsch/package-summary.html)
[阿里云](https://help.aliyun.com/product/31815.html)
[百度云](https://cloud.baidu.com/doc/BOS/index.html)
[华为云](https://support.huaweicloud.com/obs/index.html)
[京东云](https://docs.jdcloud.com/cn/object-storage-service/api/introduction-2)
[七牛云](https://developer.qiniu.com/kodo)
[腾讯云](https://cloud.tencent.com/document/product/436)
[又拍云](https://help.upyun.com/docs/storage/)
[Minio](http://www.minio.org.cn/)
[金山云](https://docs.ksyun.com/documents/38731)
[网易数帆](https://sf.163.com/help/documents/68792520222625792)
[JDBC](https://gitee.com/spring-boot-starter/oss-spring-boot-starter#%E9%87%91%E5%B1%B1%E4%BA%91)
[青云](https://docsv3.qingcloud.com/storage/object-storage/intro/object-storage/)
特别说明:本地存储、SFTP、FTP三种实现方式主要基于[hutool](https://hutool.cn/)提供的`FileUtil`、`FileNameUtil`、`AbstractFtp`相关的工具。
## 开始使用
jar包已推送至maven中央仓库,可通过如下方式导入oss-spring-boot-starter依赖
```xml
io.github.artislong
oss-spring-boot-starter
{latest.version}
```
在需要使用的Spring Bean中注入`StandardOssClient`对象即可。
StandardOssClient类提供统一的文件存储API,提供了如下方法:
- 文件上传
```java
/**
* 上传文件,默认覆盖
* @param is 输入流
* @param targetName 目标文件路径
* @return 返回文件路径
*/
default OssInfo upLoad(InputStream is,String targetName) {
return upLoad(is,targetName,true);
}
/**
* 上传文件
* @param is 输入流
* @param targetName 目标文件路径
* @param isOverride 是否覆盖
* @return 返回文件路径
*/
OssInfo upLoad(InputStream is,String targetName,Boolean isOverride);
```
- 断点续传上传
```java
/**
* 断点续传
* @param file 本地文件路径
* @param targetName 目标文件路径
* @return 文件信息
*/
default OssInfo upLoadCheckPoint(String file, String targetName) {
return upLoadCheckPoint(new File(file), targetName);
}
/**
* 断点续传
* @param file 本地文件
* @param targetName 目标文件路径
* @return 文件信息
*/
OssInfo upLoadCheckPoint(File file, String targetName);
```
- 文件下载
```java
/**
* 下载文件
* @param os 输出流
* @param targetName 目标文件路径
*/
void downLoad(OutputStream os,String targetName);
```
- 断点续传下载
```java
/**
* 断点续传
* @param localFile 本地文件路径
* @param targetName 目标文件路径
* @return 文件信息
*/
default void downLoadCheckPoint(String localFile, String targetName) {
downLoadCheckPoint(new File(localFile), targetName);
}
/**
* 断点续传
* @param localFile 本地文件
* @param targetName 目标文件路径
* @return 文件信息
*/
void downLoadCheckPoint(File localFile, String targetName);
```
- 删除
```java
/**
* 删除文件
* @param targetName 目标文件路径
*/
void delete(String targetName);
```
- 复制
```java
/**
* 复制文件,默认覆盖
* @param sourceName 源文件路径
* @param targetName 目标文件路径
*/
default void copy(String sourceName,String targetName) {
copy(sourceName,targetName,true);
}
/**
* 复制文件
* @param sourceName 源文件路径
* @param targetName 目标文件路径
* @param isOverride 是否覆盖
*/
void copy(String sourceName,String targetName,Boolean isOverride);
```
- 移动
```java
/**
* 移动文件,默认覆盖
* @param sourceName 源文件路径
* @param targetName 目标路径
*/
default void move(String sourceName,String targetName) {
move(sourceName,targetName,true);
}
/**
* 移动文件
* @param sourceName 源文件路径
* @param targetName 目标路径
* @param isOverride 是否覆盖
*/
void move(String sourceName,String targetName,Boolean isOverride);
```
- 重命名
```java
/**
* 重命名文件
* @param sourceName 源文件路径
* @param targetName 目标文件路径
*/
default void rename(String sourceName,String targetName) {
rename(sourceName,targetName,true);
}
/**
* 重命名文件
* @param sourceName 源文件路径
* @param targetName 目标路径
* @param isOverride 是否覆盖
*/
void rename(String sourceName,String targetName,Boolean isOverride);
```
- 获取文件及目录信息
```java
/**
* 获取文件信息,默认获取目标文件信息
* @param targetName 目标文件路径
* @return 文件基本信息
*/
default OssInfo getInfo(String targetName) {
return getInfo(targetName,false);
}
/**
* 获取文件信息
* isRecursion传false,则只获取当前对象信息;
* isRecursion传true,且当前对象为目录时,会递归获取当前路径下所有文件及目录,按层级返回
* @param targetName 目标文件路径
* @param isRecursion 是否递归
* @return 文件基本信息
*/
OssInfo getInfo(String targetName,Boolean isRecursion);
```
- 判断对象是否为文件
```java
/**
* 是否为文件
* 默认根据路径最后一段名称是否有后缀名来判断是否为文件,此方式不准确,当存储平台不提供类似方法时,可使用此方法
* @param targetName 目标文件路径
* @return true/false
*/
default Boolean isFile(String targetName) {
String name=FileNameUtil.getName(targetName);
return StrUtil.indexOf(name,StrUtil.C_DOT)>0;
}
```
- 判断对象是否为目录
```java
/**
* 是否为目录
* 与判断是否为文件相反
* @param targetName 目标文件路径
* @return true/false
*/
default Boolean isDirectory(String targetName) {
return !isFile(targetName);
}
```
- 判断对象是否存在
```java
/**
* 是否存在
* @param targetName 目标文件路径
* @return true/false
*/
Boolean isExist(String targetName);
```
- 分片上传
```java
/**
* 上传分片
* @param upLoadCheckPoint 断点续传对象
* @param partNum 分片索引
* @return 上传结果
*/
UpLoadPartResult uploadPart(UpLoadCheckPoint upLoadCheckPoint, int partNum, InputStream inputStream);
```
- 分片下载
```java
/**
* 下载分片
* @param key 目标文件
* @param start 文件开始字节
* @param end 文件结束字节
* @return 此范围的文件流
*/
InputStream downloadPart(String key, long start, long end);
```
更多API可通过[在线API文档](https://apidoc.gitee.com/spring-boot-starter/oss-spring-boot-starter/)查看。
具体使用可根据实际业务需求及所采用的存储平台灵活使用。
**注意:** 在开启多个存储平台后,在注入操作客户端时,需通过`@Qualifier`注解指定Bean名称,同时,每个存储平台配置多实例时,将按照自定义名称注入。具体注入方式可通过test包路径中查看。
### 本地存储
当不使用第三方服务或存储平台,仅使用本机存储时,不需要导入额外的依赖包,在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
local:
enable: true # 开启本地存储
base-path: /Study # 本地文件存储根路径
slice-config:
task-num: 8 # 并发线程数,默认等于CPU的核数
part-size: 104857600 # 1024*1024*100 断点续传分片大小
```
- 批量配置
```yaml
oss:
local:
enable: true # 开启本地存储
oss-config:
local1:
base-path: /Study1
slice-config:
task-num: 8 # 并发线程数,默认等于CPU的核数
part-size: 104857600 # 1024*1024*100 断点续传分片大小
```
### FTP
```xml
commons-net
commons-net
3.8.0
```
在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
ftp:
enable: true
host: FTP服务器IP
port: FTP服务端口
user: 用户名
password: 密码
charset: 编码
base-path: FTP服务器存储根路径
```
- 批量配置
```yaml
oss:
ftp:
enable: true
oss-config:
ftp1:
host: FTP服务器IP
port: FTP服务端口
user: 用户名
password: 密码
charset: 编码
base-path: FTP服务器存储根路径
```
### SFTP
```xml
com.jcraft
jsch
0.1.55
commons-net
commons-net
3.8.0
```
在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
sftp:
enable: true
host: SFTP服务器IP
port: SFTP服务端口
user: 用户名
password: 密码
charset: 编码
base-path: FTP服务器存储根路径
```
- 批量配置
```yaml
oss:
sftp:
enable: true
oss-config:
sftp1:
host: SFTP服务器IP
port: SFTP服务端口
user: 用户名
password: 密码
charset: 编码
base-path: FTP服务器存储根路径
```
### 阿里云
```xml
com.aliyun.oss
aliyun-sdk-oss
3.13.2
```
在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
ali:
enable: true
access-key-id: accessKeyId
access-key-secret: accessKeySecret
endpoint: endpoint
bucket-name: bucketName
base-path: 阿里云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
- 批量配置
```yaml
oss:
ali:
enable: true
oss-config:
aliOssClient1:
access-key-id: accessKeyId
access-key-secret: accessKeySecret
endpoint: endpoint
bucket-name: bucketName
base-path: 阿里云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
**注:** 对于批量配置,如access-key-id、access-key-secret、endpoint可复用,基础配置中配置这三个参数,批量配置中配置其他如bucket-name等参数即可,示例如下:
```yaml
oss:
ali:
enable: true
access-key-id: accessKeyId
access-key-secret: accessKeySecret
endpoint: endpoint
oss-config:
aliOssClient1:
bucket-name: bucketName
base-path: 阿里云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
### 华为云
```xml
com.huaweicloud
esdk-obs-java-bundle
3.21.8.1
```
在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
huawei:
enable: true
endpoint: endpoint
access-key: accessKey
secret-key: secretKey
bucket-name: backetName
base-path: 华为云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
- 批量配置
```yaml
oss:
huawei:
enable: true
oss-config:
huaweiOssClient1:
endpoint: endpoint
access-key: accessKey
secret-key: secretKey
bucket-name: backetName
base-path: 华为云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
**注:** 对于批量配置,如access-key、secret-key、endpoint可复用,基础配置中配置这三个参数,批量配置中配置其他如bucket-name等参数即可,示例如下:
```yaml
oss:
huawei:
enable: true
endpoint: endpoint
access-key: accessKey
secret-key: secretKey
oss-config:
huaweiOssClient1:
bucket-name: backetName
base-path: 华为云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
### 京东云
```xml
com.amazonaws
aws-java-sdk-s3
1.12.117
```
在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
jd:
enable: true
endpoint: endpoint
region: region
access-key: accessKey
secret-key: secretKey
bucket-name: bucket
base-path: 京东云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
- 批量配置
```yaml
oss:
jd:
enable: true
oss-config:
jdOssClient1:
endpoint: endpoint
region: region
access-key: accessKey
secret-key: secretKey
bucket-name: bucket
base-path: 京东云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
**注:** 对于批量配置,如access-key、secret-key、endpoint、region可复用,基础配置中配置这三个参数,批量配置中配置其他如bucket-name等参数即可,示例如下:
```yaml
oss:
jd:
enable: true
endpoint: endpoint
region: region
access-key: accessKey
secret-key: secretKey
oss-config:
jdOssClient1:
bucket-name: bucket
base-path: 京东云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
### 七牛云
```xml
com.qiniu
qiniu-java-sdk
7.8.0
com.qiniu
happy-dns-java
0.1.6
```
在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
qiniu:
enable: true
region: region
access-key: accessKey
secret-key: secretKey
bucket-name: bucket
base-path: 七牛云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
- 批量配置
```yaml
oss:
qiniu:
enable: true
oss-config:
qiNiuOssClient1:
region: region
access-key: accessKey
secret-key: secretKey
bucket-name: bucket
base-path: 七牛云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
**注:** 对于批量配置,如region、access-key、secret-key可复用,基础配置中配置这三个参数,批量配置中配置其他如bucket-name等参数即可,示例如下:
```yaml
oss:
qiniu:
enable: true
region: region
access-key: accessKey
secret-key: secretKey
oss-config:
qiNiuOssClient1:
bucket-name: bucket
base-path: 七牛云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
### 腾讯云
```xml
com.qcloud
cos_api
5.6.61
```
在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
tencent:
enable: true
region: region
secret-key: secretKey
secret-id: secretId
bucket-name: bucket
base-path: 腾讯云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
- 批量配置
```yaml
oss:
tencent:
enable: true
oss-config:
tencentOssClient1:
region: region
secret-key: secretKey
secret-id: secretId
bucket-name: bucket
base-path: 腾讯云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
**注:** 对于批量配置,如region、secret-key、secret-id可复用,基础配置中配置这三个参数,批量配置中配置其他如bucket-name等参数即可,示例如下:
```yaml
oss:
tencent:
enable: true
region: region
secret-key: secretKey
secret-id: secretId
oss-config:
tencentOssClient1:
bucket-name: bucket
base-path: 腾讯云存储根路径
slice-config:
task-num: 8
part-size: 104857600 # 1024*1024*100
```
### 又拍云
```xml
com.upyun
java-sdk
4.2.3
```
在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
up:
enable: true
user-name: 用户名
password: 密码
bucket-name: bucketName
base-path: 又拍云存储根路径
slice-config:
task-num: 8
```
- 批量配置
```yaml
oss:
up:
enable: true
oss-config:
upOssClient1:
user-name: 用户名
password: 密码
bucket-name: bucketName
base-path: 又拍云存储根路径
slice-config:
task-num: 8
```
**注:** 对于批量配置,如user-name、password可复用,基础配置中配置这三个参数,批量配置中配置其他如bucket-name等参数即可,示例如下:
```yaml
oss:
up:
enable: true
user-name: 用户名
password: 密码
oss-config:
upOssClient1:
bucket-name: bucketName
base-path: 又拍云存储根路径
slice-config:
task-num: 8
```
### Minio
```xml
io.minio
minio
8.3.4
provided
com.squareup.okhttp3
okhttp
4.9.3
```
在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
minio:
enable: true
endpoint: 地址
access-key: 用户名
secret-key: 密码
bucket-name: bucketName
base-path: Minio存储根路径
```
- 批量配置
```yaml
oss:
minio:
enable: true
oss-config:
minioOssClient1:
endpoint: 地址
access-key: 用户名
secret-key: 密码
bucket-name: bucketName
base-path: Minio存储根路径
```
**注:** 对于批量配置,如endpoint、access-key、secret-key可复用,基础配置中配置这三个参数,批量配置中配置其他如bucket-name等参数即可,示例如下:
```yaml
oss:
minio:
enable: true
endpoint: 地址
access-key: 用户名
secret-key: 密码
oss-config:
minioOssClient1:
bucket-name: bucketName
base-path: Minio存储根路径
```
### 金山云
```xml
com.ksyun
ks3-kss-java-sdk
1.0.2
commons-logging
commons-logging
```
在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
jinshan:
enable: true
endpoint: Endpoint
access-key-id: accessKeyId
access-key-secret: accessKeySecret
bucket-name: bucket
base-path: 根路径
slice-config:
task-num: 8
part-size: 104857600
```
- 批量配置
```yaml
oss:
jinshan:
enable: true
oss-config:
jinshanOssClient1:
endpoint: Endpoint
access-key-id: accessKeyId
access-key-secret: accessKeySecret
bucket-name: bucket
base-path: 根路径
slice-config:
task-num: 8
part-size: 104857600
```
**注:** 对于批量配置,如endpoint、access-key、secret-key可复用,基础配置中配置这三个参数,批量配置中配置其他如bucket-name等参数即可,示例如下:
```yaml
oss:
jinshan:
enable: true
endpoint: Endpoint
access-key-id: accessKeyId
access-key-secret: accessKeySecret
oss-config:
jinshanOssClient1:
bucket-name: bucket
base-path: 根路径
slice-config:
task-num: 8
part-size: 104857600
```
### 网易数帆
```xml
com.netease.cloud
nos-sdk-java-publiccloud
1.3.1
```
在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
wangyi:
enable: true
endpoint: endpoint
access-key: accessKey
secret-key: secretKey
bucket-name: bucket
base-path: 根路径
slice-config:
task-num: 8
part-size: 104857600
```
- 批量配置
```yaml
oss:
wangyi:
enable: true
oss-config:
wangyiOssClient1:
endpoint: endpoint
access-key: accessKey
secret-key: secretKey
bucket-name: bucket
base-path: 根路径
slice-config:
task-num: 8
part-size: 104857600
```
**注:** 对于批量配置,如endpoint、access-key、secret-key可复用,基础配置中配置这三个参数,批量配置中配置其他如bucket-name等参数即可,示例如下:
```yaml
oss:
wangyi:
enable: true
endpoint: endpoint
access-key: accessKey
secret-key: secretKey
oss-config:
wangyiOssClient1:
bucket-name: bucket
base-path: 根路径
slice-config:
task-num: 8
part-size: 104857600
```
### Jdbc
```xml
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java
```
在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
jdbc:
enable: true
base-path: /Study
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://localhost:3306/oss?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
driver: com.mysql.cj.jdbc.Driver
username: root
password: root
```
- 批量配置
```yaml
oss:
jdbc:
enable: true
oss-config:
jdbcOssClient1:
base-path: /Study
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://localhost:3306/oss?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
driver: com.mysql.cj.jdbc.Driver
username: root
password: root
```
**注:**
1、当项目本身不使用数据库时,需增加此注解`@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)`,移除数据源默认配置,仅需配置对象存储数据源即可
2、若想直接使用项目本身配置的数据源作为对象存储库时,则不需要增加如上注解,同时在配置好默认数据源的同时,OSS的配置可参考下面配置。
3、存储表结构建表脚本见jar包中的jdbc目录下
```yaml
oss:
jdbc:
enable: true
base-path: /Study
```
### 青云
```xml
com.yunify
qingstor.sdk.java
2.5.2
```
在application.yml中增加如下配置:
- 单个配置
```yaml
oss:
qingyun:
enable: true
zone: zone
access-key: accessKey
access-secret: accessSecret
bucket-name: bucketName
base-path: 根路径
slice-config:
task-num: 8
part-size: 104857600
```
- 批量配置
```yaml
oss:
qingyun:
enable: true
oss-config:
qingYunOssClient1:
zone: zone
access-key: accessKey
access-secret: accessSecret
bucket-name: bucketName
base-path: 根路径
slice-config:
task-num: 8
part-size: 104857600
```
**注:** 对于批量配置,如zone、access-key、secret-key可复用,基础配置中配置这三个参数,批量配置中配置其他如bucket-name等参数即可,示例如下:
```yaml
oss:
qingyun:
enable: true
zone: zone
access-key: accessKey
access-secret: accessSecret
oss-config:
qingYunOssClient1:
bucket-name: bucketName
base-path: 根路径
slice-config:
task-num: 8
part-size: 104857600
```
新功能持续增加中,敬请期待!!!
## 单元测试
