# sim-storage
**Repository Path**: feige_code/sim-storage
## Basic Information
- **Project Name**: sim-storage
- **Description**: 集成了MinIO、COS、OSS等三方存储的文件管理
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2023-06-21
- **Last Updated**: 2023-06-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
### 介绍
存储服务,由原sim-framework中独立出来,升级依赖版本并简化不必要依赖。
现集成Minio、OSS、COS、本地文件。持续完善中。
### 使用
- 依赖
```xml
com.yao2san
sim-storage-client
0.0.1
rdc-releases
https://61c59941e74da01affdc9d7b:Swtu1HNF1phz@packages.aliyun.com/maven/repository/2170823-release-TpgdUY/
true
false
```
- 配置示例
```yaml
sim:
storage:
# 启用存储服务
enable: true
# 存储类型:Minio,可选值:local、minio、ftp
type: minio
# minio存储配置
minio:
# minio地址
endpoint: http://localhost
# 端口
port: 9000
# 存储桶
bucket: test
# 根路径(可选,默认为空)
path: /upload/
# access-key
access-key: U77bBCMYW1GVmow4
# secret-key
secret-key: tSiDkUNARZYhlARoUzT2STJlyYnezmG2
# 腾讯COS配置
tencent-cos:
# 区域
region: xxx
# 服务地址:替换成你申请的bucket所在的endpoint
endpoint: xxx
# 在腾云云申请的accessKeyId(建议使用子账号)
access-key: xxx
# 在腾云云申请的secretKey(建议使用子账号)
secret-key: xxx
# 存储桶
bucket: xxx
# 根路径(可选)
path: /test
ali-oss:
# 区域
region: xxx
# 服务地址:替换成你申请的bucket所在的endpoint(不要带http或https)
endpoint: oss-cn-hongkong.aliyuncs.com
# 在腾云云申请的accessKeyId(建议使用子账号)
access-key: xxx
# 在腾云云申请的secretKey(建议使用子账号)
secret-key: xxx
# 存储桶
bucket: xxx
# 根路径(可选)
path:
# 角色(用于生成临时凭证,具体请参照:https://help.aliyun.com/document_detail/100624.html)
role-arn: acs:ram::1642592308587130:role/oss-manager # 本地存储配置
local:
bucket: "D:\\temp"
# 上传的根路径
path: "D:\\temp\\"
# web访问映射前缀
prefix: static
# 应用地址
url: http://localhost:8080
# ftp存储配置
ftp:
# 可选ftp、sftp
type: ftp
# ftp服务地址
host: 127.0.0.1
# ftp服务端口
port: 21
# 根目录
path: /data/
```
- 存储类型
sim-storage-client支持以下存储类型:
| 类型 | 版本要求 | 说明 |
| -------------- | ---- | ------------------------------- |
| 本地存储(LOCAL) | 无 | 支持本地文件系统、NAS文件系统以及其它任意可挂载的文件系统。 |
| Minio存储(MINIO) | > 8.3 | Minion是一个高性能的对象存储服务,集成了它的客户端。 |
| FTP存储(FTP) | 无 | 待实现。 |
| 阿里云对象存储(OSS) | 无 | 接入了阿里云对象存储。 |
| 腾讯云对象存储(COS) | 无 | 接入了腾讯云对象存储。 |
### 上传和下载
- **文件上传**
```java
@Autowired
private Uploader uploader;
@PostMapping("upload")
public void upload(MultipartFile file)throws IOException{
String object=file.getOriginalFilename();
UploadResult result=uploader.upload(file,object);
}
```
- **元数据**
```java
UploadArgs args=UploadArgs.builder().build();
args.add("user-id","1");
UploadResult result=uploader.upload(file,object,args);
```
- **上传结果**`UploadResult`
| 属性 | 类型 | 说明 |
| ---------- | ---------- | ------------------ |
| success | boolean | 上传成功/失败 |
| message | String | 上传失败时的失败原因 |
| object | String | 上传后的文件名(含路径,基于根路径) |
| isDir | boolean | 是否是目录 |
| size | long | 文件大小 |
| url | String | 文件访问/下载链接 |
| uploadArgs | UploadArgs | 上传时的参数 |
- **上传事件**
文件上传后,会发布一个`UploadEvent` 事件,您可以监听此事件做一些额外处理。
```java
@Configuration
@Slf4j
public class UploadEventListener {
@EventListener
public void handler(UploadEvent event) {
log.info("Receive upload result event, time:{}, result:{}", event.getTimestamp(), JSONObject.toJSONString(event.getSource()));
}
}
//输出:Receive upload result event, time:1663821454180, result:{"object":"images/jars.zip","size":10066282,"success":true,"uploadArgs":{"userId":"1"},"url":"http://localhost:9000/test/images/test.png"}
```
- **自动生成目录**
sim-storage-client支持目录生成策略,内置3种策略:
(1) `EmptyFolderPolicy` :空策略,即不生成(默认)
(2) `DayFolderPolicy` :按天生成,每天一个目录,如20220922。
(3) `MonthFolderPolicy` :按月生成,每月一个目录,如202209。
您也可以自定义生成策略,只需要实现`FolderPolicy` 接口并将它放入Spring容器中即可:
```java
public class CustomerFolderPolicy implements FolderPolicy {
@Override
public String create() {
//TODO your code
return "";
}
}
@Bean
public FolderPolicy folderPolicy() {
return new CustomerFolderPolicy();
}
```
- **文件下载**
```java
@Autowired
private Downloader downloader;
@GetMapping("download")
public void download(String fileName,HttpServletResponse response)throws IOException{
downloader.download(fileName,response.getOutputStream());
}
```
### 文件管理
`StorageManager` 提供了基础的文件管理功能,支持本地存储和Minio。
- 通过Spring容器获取`StorageManager`
```java
@Autowired
private StorageManager storageManager;
```
- 查询文件
```java
String prefix="/images/";
//列出指定前缀的文件。如果以"/"结尾则表示列出其目录下的所有文件。
storageManager.list(prefix);
//列出指定前缀的且从/images/test.png开始之后(不包含)的文件,当文件量过多时,可基于startAfter分页。
String startAfter="/images/test.png";
storageManager.list(prefix,startAfter);
```
- 删除文件
```java
String object="/images/test.png";
storageManager.delete(object);
```
- 文件是否存在
```java
String object="/images/test.png";
boolean exist=storageManager.exist(object)
```
- 重命名文件
```java
String source="/images/test.png";
String target="/images/test2.png";
storageManager.rename(source,target);
```
- 复制文件
```java
String source="/images/test.png";
String target="/images/test2.png";
storageManager.copy(source,target);
```
- 获取临时凭证(STS)
```java
//获取有效期为30分钟的临时凭证
storageManager.credentials(1800);
```
💡 注意:临时凭证目前仅支持阿里OSS和腾讯COS!