minio安装与使用

本文介绍windows和linux安装minio,以及minio的基本使用。

一、Minio是什么

Minio是一个优秀的对象存储解决方案,是一个高性能,轻量级的对象存储服务器。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

Minio是用Golang语言开发的,其安装简单,也易理解。

二、windows安装Minio

Minio有两个端,分别为服务端和客户端,服务端即Minio服务,客户端是可视化界面,方便用户操作理解。

2.1、首先在本地创建三个文件夹

2.2、 去官网下载

下载网址
下载Windows版的服务端和客户端文件

 将下载好的文件放在bin文件夹中

2.3、运行minio

创建一个minion.bat文件,粘贴以下代码

@echo off
REM 声明采用UTF-8编码
chcp 65001
echo.
echo [信息] 运行MinIO文服务器。
echo.
:: 设置窗口标题
title Minio文件服务

:: 设置用户名为minio
setx MINIO_ROOT_USER "minio"
:: 设置密码为minioadmin
setx MINIO_ROOT_PASSWORD "minioadmin"
 
cd %~dp0
:: 切换到minio.exe文件所在目录
cd D:\app\minio\bin
:: 启动minio服务
minio.exe server D:\app\minio\data --console-address ":9002" --address ":9000" >D:\app\minio\logs\minio.log
pause

注意:用户名最少为4位,密码最少为8位。

其中启动命令为最后一行,9002是客户端端口,9000是服务端端口,可自定义。

保存之后,双击启动minio.bat

成功启动页面

最后http://localhost:9002/browser/进入客户端,用刚刚设置的用户名和密码登陆即可。

三、Linux安装minio

3.1、创建minio文件夹

mkdir minio

在新建的文件夹中创建data文件夹(用于存储文件数据),和minio.log文件(用于记录日志)

cd minio/
mkdir data
touch minio.log

3.2、下载minio

#下载
wget https://dl.min.io/server/minio/release/linux-amd64/minio

 3.3、修改用户名和密码

#密码修改
export MINIO_ROOT_USER=minio
export MINIO_ROOT_PASSWORD=minioadmin

3.4、 启动

#启动,控制台打印日志
./minio server /minio/data --address ":9000" --console-address ":9001"

#后台启动,打印日志到文件
nohup ./minio server --address ":9000" --console-address ":9001" /minio/data > /minio/minio.log 2>&1 &

如果访问不了,注意查看防火墙是否关闭 

四、Java上传和下载文件

4.1、导入依赖

        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.5.2</version>
            <exclusions>
                <exclusion>
                    <groupId>com.squareup.okhttp3</groupId>
                    <artifactId>okhttp</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.10.0</version>
        </dependency>

4.2、配置yml文件

minio:
  url: http://localhost:9000
  userName: minio
  password: minioadmin

4.3、创建实体类

@Configuration
@ConfigurationProperties("minio")
@Data
public class MinioDomain {

    private String url;

    private String userName;

    private String password;
}

需和yml文件一致

4.4、创建配置文件

@Configuration
public class MinioConfig {

    private MinioDomain minioDomain;

    @Autowired
    public void setMinioDomain(MinioDomain minioDomain){
        this.minioDomain = minioDomain;
    }

    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint(minioDomain.getUrl())
                .credentials(minioDomain.getUserName(), minioDomain.getPassword())
                .build();
    }
}

4.5、文件上传

 public String upload(MultipartFile file) {
        String url;
        try {
            //判断桶是否存在,不存在就新建
            boolean test = minioClient.bucketExists(BucketExistsArgs.builder().bucket("test").build());
            if (!test) {
             minioClient.makeBucket(MakeBucketArgs.builder().bucket("test").build());
            }
            //获取当前年月日,创建文件夹
            String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            String[] split = date.split("-");
            String uuid = UUID.randomUUID().toString();
            //加一个/表示创建文件夹
            //添加uuid,防止同名文件夹覆盖
            String fileName = split[0] + "/" + split[1] + "/" + split[2] + "/" + uuid + file.getOriginalFilename();
            //上传文件
            InputStream inputStream = file.getInputStream();
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                .bucket(bucketName)
                .object(objectName)
                .contentType(file.getContentType())
                .stream(inputStream, inputStream.available(), -1)
                .build();
            minioClient.putObject(putObjectArgs);
            //获取url
            GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()
                .bucket(bucketName)
                .object(objectName)
                .method(Method.GET)
                .build();
             String fileUrl=minioClient.getPresignedObjectUrl(args);
             url = fileUrl.substring(0,fileUrl.indexOf('?'));//截取问号之前的地址可以永久访问
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return url;
    }

可以通过url来查看文件是否上传成功,也可以在客户端查看。

4.6、文件下载

public void download(HttpServletRequest request, HttpServletResponse response,String url ) throws UnsupportedEncodingException {
        String objectUrl = url.split("test"+"/")[1];
        //将传递的url 进行切割,获取到相对于桶的文件名
        String fileUrl = StringUtils.substringBeforeLast(url, ".");
        String fileName = URLEncoder.encode(StringUtils.substringAfterLast(fileUrl, "/"),"UTF-8");
        //获取后缀名
        String s = StringUtils.substringAfterLast(url, ".");
        // 设置响应的内容类型为文件类型
        response.setContentType("application/octet-stream");
        // 设置响应头,指定文件名
        response.setHeader("Content-Disposition", "attachment; filename="+fileName+"."+s);
        // 缓冲区大小
        byte[] buffer = new byte[1024];
        int bytesRead;
        InputStream inputStream = null;
        ServletOutputStream outputStream = null;
        try{
            //获取文件流
            GetObjectArgs getObjectArgs = GetObjectArgs.builder()
                .bucket("test")
                .object(objectUrl)
                .build();
            inputStream = minioClient.getObject(getObjectArgs);
            // 获取输出流
            outputStream = response.getOutputStream();
            // 将输入流中的数据写入输出流
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            inputStream.close();
            outputStream.close();

        }catch (Exception e){
            e.printStackTrace();
        }
    }

如果通过返回的url无法访问上传的文件,报错为403,只需将当前桶的权限改为public即可正常访问。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值