• 【sim-storage-client】SpringBoot集成Minio与本地存储


    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.3Minion是一个高性能的对象存储服务,集成了它的客户端。
    FTP存储(FTP)实现中。

    3.5.2 上传和下载

    • 文件上传
    @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** **
    属性类型说明
    successboolean上传成功/失败
    messageString上传失败时的失败原因
    objectString上传后的文件名(含路径,基于根路径)
    isDirboolean是否是目录
    sizelong文件大小
    urlString文件访问/下载链接
    uploadArgsUploadArgs上传时的参数
    • 上传事件

    文件上传后,会发布一个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());
    }
    

    3.5.3 文件管理

    StorageManager 提供了基础的文件管理功能,支持本地存储和Minio。

    • 通过Spring容器获取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);
    
  • 相关阅读:
    $().serializeJson()获取不到type=“checkbox“的name
    c语言socket ipv4服务端
    Python:函数和代码复用
    GeoServer安装以及部署
    Linux Shell :正则表达式
    257. 二叉树的所有路径
    【小月电子】FPGA开发板(XLOGIC_V1)系统学习教程-LESSON10
    一、综合——通信职业道德
    PMP每日一练 | 考试不迷路-8.29(包含敏捷+多选)
    Vue 最简单路由 页面路由 配置路由
  • 原文地址:https://blog.csdn.net/wxgxgp/article/details/127069125