sim-storage-client提供文件上传和下载功能,并集成了FTP、Minio以及本地存储,统一上传、下载接口,也支持自定义扩展存储方式。
源码地址:sim-storage-client
<dependency>
<groupId>com.yao2sangroupId>
<artifactId>sim-storage-clientartifactId>
<version>1.0.0version>
dependency>
<repositories>
<repository>
<id>rdc-releasesid>
<url>https://61c59941e74da01affdc9d7b:Swtu1HNF1phz@packages.aliyun.com/maven/repository/2170823-release-TpgdUY/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>falseenabled>
snapshots>
repository>
repositories>
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
# 本地存储配置
local:
# 本地文件存放根目录
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) | 无 | 实现中。 |
@Autowired
private Uploader uploader;
@PostMapping("upload")
public void upload(MultipartFile file) throws IOException {
String object = file.getOriginalFilename();
UploadResult result = uploader.upload(file, object);
}
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 事件,您可以监听此事件做一些额外处理。
@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容器中即可:
public class CustomerFolderPolicy implements FolderPolicy {
@Override
public String create() {
//TODO your code
return "";
}
}
@Bean
public FolderPolicy folderPolicy() {
return new CustomerFolderPolicy();
}
@Autowired
private Downloader downloader;
@GetMapping("download")
public void download(String fileName, HttpServletResponse response) throws IOException {
downloader.download(fileName, response.getOutputStream());
}
StorageManager 提供了基础的文件管理功能,支持本地存储和Minio。
StorageManager@Autowired
private StorageManager storageManager;
String prefix = "/images/";
//列出指定前缀的文件。如果以"/"结尾则表示列出其目录下的所有文件。
storageManager.list(prefix);
//列出指定前缀的且从/images/test.png开始之后(不包含)的文件,当文件量过多时,可基于startAfter分页。
String startAfter = "/images/test.png";
storageManager.list(prefix,startAfter);
String object= "/images/test.png";
storageManager.delete(object);
String object= "/images/test.png";
boolean exist = storageManager.exist(object)
String source= "/images/test.png";
String target = "/images/test2.png";
storageManager.rename(source,target);
String source= "/images/test.png";
String target = "/images/test2.png";
storageManager.copy(source,target);