# 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 ``` 新功能持续增加中,敬请期待!!! ## 单元测试 ![](http://assets.processon.com/chart_image/620774561e08530f01793ea6.png)