当前位置: 代码网 > it编程>编程语言>Java > SpringBoot项目集成MinIO全过程

SpringBoot项目集成MinIO全过程

2024年08月27日 Java 我要评论
最近在学习minio,所以想让自己的springboot项目集成minio,在网上查阅资料,并进行操作的过程中遇到一些问题,所以想把自己遇到的坑和完成步骤记录下来供自己和各位查阅。一. minio的下

最近在学习minio,所以想让自己的springboot项目集成minio,在网上查阅资料,并进行操作的过程中遇到一些问题,所以想把自己遇到的坑和完成步骤记录下来供自己和各位查阅。

一. minio的下载安装以及基本使用

1. 下载地址:https://dl.min.io/server/minio/release/windows-amd64/minio.exe

2. 下载好后需要手动创建data文件夹用于存储minio中的数据。

3. 键入cmd

4. 设置minio的一些变量

set minio_root_user=admin
set minio_root_password=admin123
set minio_access_key=admin
set minio_secret_key=admin123

下面是我踩的坑,如果只设置了minio_root_user和minio_root_password的值,而不设置minio_access_key和minio_secret_key的值,当启动minio服务的时候就会报以下异常:

所以一定要设置好后面两个变量的值。

5. 启动minio服务

> minio.exe server data

启动后就会出现minio服务的地址,按住ctrl再点击即可访问该网址。

6.进入登录页面后,输入对应的用户名和密码,也就是之前设置的minio_root_user和minio_root_password的值。

7. 进入主界面后,点击左侧导航栏中的buckets,然后点击create bucket。

8. 创建好之后,点击左侧导航栏中的object browser就可以看到创建好的桶了。

9. 进入该桶,点击upload,上传一个文件,桶的默认权限是private,所以外界访问不到,需要修改访问权限为public,但是要注意安全问题。

10. 点击左侧导航栏中的buckets,进入该桶,修改权限为public,这样外界就可以访问上传的文件了。

二. springboot集成minio

1.引入依赖

<dependency>
  <groupid>io.minio</groupid>
  <artifactid>minio</artifactid>
  <version>7.0.2</version>
</dependency>

2. 编写配置文件

server:
 port: 8081
spring:
 # 配置文件上传大小限制
 servlet:
  multipart:
   max-file-size: 200mb
   max-request-size: 200mb
minio:
 host: http://127.0.0.1:9000
 url: ${minio.host}/${minio.bucket}/
 access-key: minioadmin
 secret-key: minioadmin
 bucket: public 

3. 添加配置文件

package com.suwell.serv.ocr.component;
​
import io.minio.minioclient;
import io.minio.objectstat;
import io.minio.putobjectoptions;
import io.minio.result;
import io.minio.messages.bucket;
import io.minio.messages.item;
import org.springframework.beans.factory.initializingbean;
import org.springframework.beans.factory.annotation.value;
import org.springframework.stereotype.component;
import org.springframework.util.assert;
import org.springframework.web.multipart.multipartfile;
import org.springframework.web.util.uriutils;
​
import javax.servlet.http.httpservletresponse;
import java.io.inputstream;
import java.net.urlencoder;
import java.nio.charset.standardcharsets;
import java.util.arraylist;
import java.util.list;
​
​
@component
public class minioconfig implements initializingbean {
​
    @value(value = "${minio.bucket}")
    private string bucket;
​
    @value(value = "${minio.host}")
    private string host;
​
    @value(value = "${minio.url}")
    private string url;
​
    @value(value = "${minio.access-key}")
    private string accesskey;
​
    @value(value = "${minio.secret-key}")
    private string secretkey;
​
    private minioclient minioclient;
​
    @override
    public void afterpropertiesset() throws exception {
        assert.hastext(url, "minio url 为空");
        assert.hastext(accesskey, "minio accesskey为空");
        assert.hastext(secretkey, "minio secretkey为空");
        this.minioclient = new minioclient(this.host, this.accesskey, this.secretkey);
    }
​
​
​
    /**
     * 上传
     */
    public string putobject(multipartfile multipartfile) throws exception {
        // bucket 不存在,创建
        if (!minioclient.bucketexists(this.bucket)) {
            minioclient.makebucket(this.bucket);
        }
        try (inputstream inputstream = multipartfile.getinputstream()) {
            // 上传文件的名称
            string filename = multipartfile.getoriginalfilename();
            // putobjectoptions,上传配置(文件大小,内存中文件分片大小)
            putobjectoptions putobjectoptions = new putobjectoptions(multipartfile.getsize(), putobjectoptions.min_multipart_size);
            // 文件的contenttype
            putobjectoptions.setcontenttype(multipartfile.getcontenttype());
            minioclient.putobject(this.bucket, filename, inputstream, putobjectoptions);
            // 返回访问路径
            return this.url + uriutils.encode(filename, standardcharsets.utf_8);
        }
    }
​
    /**
     * 文件下载
     */
    public void download(string filename, httpservletresponse response){
        // 从链接中得到文件名
        inputstream inputstream;
        try {
            minioclient minioclient = new minioclient(host, accesskey, secretkey);
            objectstat stat = minioclient.statobject(bucket, filename);
            inputstream = minioclient.getobject(bucket, filename);
            response.setcontenttype(stat.contenttype());
            response.setcharacterencoding("utf-8");
            response.setheader("content-disposition", "attachment;filename=" + urlencoder.encode(filename, "utf-8"));
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputstream.read(buffer)) > 0) {
                response.getoutputstream().write(buffer, 0, length);
            }
            inputstream.close();
        } catch (exception e){
            e.printstacktrace();
            system.out.println("有异常:" + e);
        }
    }
​
    /**
     * 列出所有存储桶名称
     *
     * @return
     * @throws exception
     */
    public list<string> listbucketnames()
            throws exception {
        list<bucket> bucketlist = listbuckets();
        list<string> bucketlistname = new arraylist<>();
        for (bucket bucket : bucketlist) {
            bucketlistname.add(bucket.name());
        }
        return bucketlistname;
    }
​
    /**
     * 查看所有桶
     *
     * @return
     * @throws exception
     */
    public list<bucket> listbuckets()
            throws exception {
        return minioclient.listbuckets();
    }
​
    /**
     * 检查存储桶是否存在
     *
     * @param bucketname
     * @return
     * @throws exception
     */
    public boolean bucketexists(string bucketname) throws exception {
        boolean flag = minioclient.bucketexists(bucketname);
        if (flag) {
            return true;
        }
        return false;
    }
​
    /**
     * 创建存储桶
     *
     * @param bucketname
     * @return
     * @throws exception
     */
    public boolean makebucket(string bucketname)
            throws exception {
        boolean flag = bucketexists(bucketname);
        if (!flag) {
            minioclient.makebucket(bucketname);
            return true;
        } else {
            return false;
        }
    }
​
    /**
     * 删除桶
     *
     * @param bucketname
     * @return
     * @throws exception
     */
    public boolean removebucket(string bucketname)
            throws exception {
        boolean flag = bucketexists(bucketname);
        if (flag) {
            iterable<result<item>> myobjects = listobjects(bucketname);
            for (result<item> result : myobjects) {
                item item = result.get();
                // 有对象文件,则删除失败
                if (item.size() > 0) {
                    return false;
                }
            }
            // 删除存储桶,注意,只有存储桶为空时才能删除成功。
            minioclient.removebucket(bucketname);
            flag = bucketexists(bucketname);
            if (!flag) {
                return true;
            }
​
        }
        return false;
    }
​
    /**
     * 列出存储桶中的所有对象
     *
     * @param bucketname 存储桶名称
     * @return
     * @throws exception
     */
    public iterable<result<item>> listobjects(string bucketname) throws exception {
        boolean flag = bucketexists(bucketname);
        if (flag) {
            return minioclient.listobjects(bucketname);
        }
        return null;
    }
​
    /**
     * 列出存储桶中的所有对象名称
     *
     * @param bucketname 存储桶名称
     * @return
     * @throws exception
     */
    public list<string> listobjectnames(string bucketname) throws exception {
        list<string> listobjectnames = new arraylist<>();
        boolean flag = bucketexists(bucketname);
        if (flag) {
            iterable<result<item>> myobjects = listobjects(bucketname);
            for (result<item> result : myobjects) {
                item item = result.get();
                listobjectnames.add(item.objectname());
            }
        }
        return listobjectnames;
    }
​
    /**
     * 删除一个对象
     *
     * @param bucketname 存储桶名称
     * @param objectname 存储桶里的对象名称
     * @throws exception
     */
    public boolean removeobject(string bucketname, string objectname) throws exception {
        boolean flag = bucketexists(bucketname);
        if (flag) {
            list<string> objectlist = listobjectnames(bucketname);
            for (string s : objectlist) {
                if(s.equals(objectname)){
                    minioclient.removeobject(bucketname, objectname);
                    return true;
                }
            }
        }
        return false;
    }
​
    /**
     * 文件访问路径
     *
     * @param bucketname 存储桶名称
     * @param objectname 存储桶里的对象名称
     * @return
     * @throws exception
     */
    public string getobjecturl(string bucketname, string objectname) throws exception {
        boolean flag = bucketexists(bucketname);
        string url = "";
        if (flag) {
            url = minioclient.getobjecturl(bucketname, objectname);
        }
        return url;
    }
​
}

4. 编写测试类进行测试

package com.suwell.serv.ocr.controller;
​
import com.suwell.serv.ocr.component.minioconfig;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.multipartfile;
​
import javax.servlet.http.httpservletresponse;
import java.util.list;
​
@restcontroller
@crossorigin
@requestmapping("/test")
public class miniocontroller {
​
    @autowired
    minioconfig minioconfig;
​
    // 上传
    @postmapping("/upload")
    public object upload(@requestparam("file") multipartfile multipartfile) throws exception {
        return this.minioconfig.putobject(multipartfile);
    }
​
    // 下载文件
    @getmapping("/download")
    public void download(@requestparam("filename")string filename, httpservletresponse response) {
        this.minioconfig.download(filename,response);
    }
​
    // 列出所有存储桶名称
    @postmapping("/list")
    public list<string> list() throws exception {
        return this.minioconfig.listbucketnames();
    }
​
    // 创建存储桶
    @postmapping("/createbucket")
    public boolean createbucket(string bucketname) throws exception {
        return this.minioconfig.makebucket(bucketname);
    }
​
    // 删除存储桶
    @postmapping("/deletebucket")
    public boolean deletebucket(string bucketname) throws exception {
        return this.minioconfig.removebucket(bucketname);
    }
​
    // 列出存储桶中的所有对象名称
    @postmapping("/listobjectnames")
    public list<string> listobjectnames(string bucketname) throws exception {
        return this.minioconfig.listobjectnames(bucketname);
    }
​
    // 删除一个对象
    @postmapping("/removeobject")
    public boolean removeobject(string bucketname, string objectname) throws exception {
        return this.minioconfig.removeobject(bucketname, objectname);
    }
​
    // 文件访问路径
    @postmapping("/getobjecturl")
    public string getobjecturl(string bucketname, string objectname) throws exception {
        return this.minioconfig.getobjecturl(bucketname, objectname);
    }
}

5. 使用postman进行本地测试

6. 最后查看public桶中是否有刚才上传的文件就可以了。如果有则表明你的项目已经成功集成minio了。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com