# storage-spring-boot-starter
**Repository Path**: zouchanglin/storage-spring-boot-starter
## Basic Information
- **Project Name**: storage-spring-boot-starter
- **Description**: OSS对象存储服务SpringBoot启动器,目前支持七牛云、阿里云,简化了繁琐配置,让用户到享受开箱即用的体验。
- **Primary Language**: Unknown
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2020-10-14
- **Last Updated**: 2021-10-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README

立马享受到简单易用的存储服务,完美支持异步与回调策略
[English](./README.md) | 简体中文
# 项目简介
本项目集成了七牛云的对象存储服务SDK,阿里云的OOS存储服务SDK,并且简化了繁琐的配置,让用户到享受开箱即用的体验。后期将支持更多存储服务平台,并且将引入文件存储管理引擎,帮助用户快速搭建起基础服务设施。
# 使用必看
文件上传分为两种类型,一种是客户端上传,即用户终端设备Android/iOS或者React、Vue、Angular等前端应用自行上传文件至七牛云。另一种是服务端上传,即服务器端直接上传文件至七牛云。
* 客户端上传:需要从服务端获取对应的Token,Token只能使用一次,如果是断点续传,Token的有效期是一个小时
* 服务端上传:同样需要服务器自己获取Token,利用Token进行文件上传操作,如果是断点续传,Token的有效期是一个小时。
所以为了解决文件存储API的复杂性问题,如果是为了客户端上传的需求,则引入QiNiuAuthService,方便各种Token的获取。如果是服务器端上传,则直接引入QiNiuUploadService即可。
# 快速开始
### step1.引入依赖
> **Maven**
```xml
jitpack.io
https://jitpack.io
com.github.zouchanglin
storage-spring-boot-starter
1.1
```
> **gradle**
```groovy
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.zouchanglin:storage-spring-boot-starter:v1.0'
}
```
### step2.配置AK/SK
在application.yml配置七牛/阿里云的AK、SK、存储空间、机房地址。机房地址属于可选项,配置了机房地址可以减少一次请求,提升交互效率,配置为如下即可,可选的机房华东(huadong)、华北(huabei)、华南(huanan)、北美(beimei)、东南亚(xinjiapo):
```yml
qiniu:
access-key: 79sjsihduednaxnjdnekjnde
secret-key: xnjdnekjnde21l3kne4br4
# 空间配置
bucket-name: image-server
# 机房配置 huadong、huabei、huanan、beimei、xinjiapo
region: huadong
```
### step3.注入组件
```java
@Service
public class DemoService {
@Autowired
private QiNiuAuthService qiNiuAuthService;
@Autowired
private QiNiuUploadService qiNiuUploadService;
}
```
### step4.享受过程
尽情享用简化配置的带来的好处吧。
# API参考
### 获取Token
#### 1、获取常规Token
```java
String token = qiNiuAuthService.getToken();
```
#### 2、获取文件覆盖的Token
```java
String oldFileName = "example.file";
String token = qiNiuAuthService.getTokenByCover(oldFileName);
```
#### 3、获取带回调的Token
```java
String callBackUrl = "http://example.com/fileupload/callback";
String token = qiNiuAuthService.getTokenCallBack(callBackUrl);
```
设置回调地址的话会立即返回,返回数据为NULL。回调接口收到的数据为:
```json
{
"bucket": "your bucket",
"ext": ".txt",
"fname": "example.txt",
"fprefix": "example",
"fsize": 1024,
"hash": "FmFit5fEfTPsDLSyeD3OoSKqsGpS",
"key": "example.md",
"mimeType": "application/octet-stream",
"uuid": "8875ea3f-b93f-4b58-9f2f-54fcd68ccab3"
}
```
关于这些JSON字段的解释可以参考[文档 ](https://developer.qiniu.com/kodo/manual/1235/vars#magicvar)
### 文件上传
#### 4、本地文件上传
```java
// 本地文件路径
String localFilePath = "/root/example.txt";
// 目标文件名称
String descFileName = "myQiNiuExample.txt";
ReturnBody returnBody = qiNiuUploadService.uploadLocalFile(localFilePath, descFileName, null);
```
#### 5、ByteArray上传
```java
byte[] bytes = "ExampleString".getBytes();
// 目标文件名称
String descFileName = "myQiNiuExample";
ReturnBody returnBody = qiNiuUploadService.uploadByteArray(bytes, descFileName, null);
```
#### 6、Stream上传
```java
// 目标文件名称
String descFileName = "myQiNiuExample";
byte[] bytes = "ExampleString".getBytes();
ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
ReturnBody returnBody = qiNiuUploadService.uploadStream(stream, descFileName, null);
```
#### 7、三种上传回调
上面的示例代码演示了无回调URL的情况,即qiNiuUploadService.upload*()的第三个参数都是NULL。
```java
// 本地文件路径
String localFilePath = "/root/example.txt";
// 目标文件名称
String descFileName = "myQiNiuExample.txt";
// 回调URL
String callBackUrl = "http://example.com/upload/callback";
qiNiuUploadService.uploadLocalFile(localFilePath, descFileName, callBackUrl);
```
上述例子中,http://example.com/upload/callback 接口接收的数据就是以POST形式接收的ReturnBody对象。参考3、获取带回调的Token中的JSON数据。
### 文件(批量)管理
#### 1、文件列表
```java
@Autowired
private QiNiuManageService qiNiuManageService;
List allFileList = qiNiuManageService.getAllFileList();
```
#### 2、根据文件名搜索
注意这个是从左往右全部匹配:
```java
@Autowired
private QiNiuManageService qiNiuManageService;
List filesByPrefix = qiNiuManageService.getFilesByPrefix(key);
```
#### 3、批量修改文件MineType
```java
@Autowired
private QiNiuBatchManageService qiNiuBatchManageService;
Map keyMineMap = new HashMap<>();
keyMineMap.put("test.png", "image/png");
keyMineMap.put("test.mp4", "image/png");
keyMineMap.put("test.mp3", "application/zip");
int changeItems = qiNiuBatchManageService.batchChangeMimeType(keyMineMap);
```
#### 4、批量复制文件
```java
@Autowired
private QiNiuBatchManageService qiNiuBatchManageService;
String[] keys = {"test.png", "test.gif", "test.mp4"};
String suffix = "copy";
int copyItems = qiNiuBatchManageService.batchCopyFile(keys, suffix);
// test.png -> test.png.copy
// test.gif -> test.gif.copy
// test.mp4 -> test.mp4.copy
```
#### 5、批量重命名文件
```java
@Autowired
private QiNiuBatchManageService qiNiuBatchManageService;
Map keyNewName = new HashMap<>();
keyNewName.put("test.png", "new.png");
keyNewName.put("test.mp4", "new.mp4");
keyNewName.put("test.mp3", "new.mp3");
int changeItems = qiNiuBatchManageService.batchRenameFile(keyNewName);
```
#### 6、批量删除文件
```java
@Autowired
private QiNiuBatchManageService qiNiuBatchManageService;
String[] keys = {"test.png", "test.gif", "test.mp4"};
int changeItems = qiNiuBatchManageService.batchDeleteFile(keys);
```
# 版本更新
### 1.0
支持七牛云的三种Token获取,文件、字节数组、流的上传,且支持断点续传。
### 1.1
支持单文件管理、文件批量管理。修复Bean装配问题的BUG。
### 1.2
支持自定义ReturnBody,也就是回调时可以携带自己的自定义数据。