minio使用

一、介绍

开源协议的对象存储服务,轻量,性能强

二、安装

windows版链接: https://pan.baidu.com/s/1vv2p8bZBeZFG9cpIhDLVXQ?pwd=s5dd 提取码: s5dd 

下载后创建minioData文件用于储存文件

创建run.bat脚本,内容如下

# 设置用户名
set MINIO_ROOT_USER=admin
# 设置密码(8位)
set MINIO_ROOT_PASSWORD=12345678
minio.exe server --address :9000 --console-address :9001 D:\devtool\minioData

默认账号密码是minioadmin/minioadmin ,编写bat脚本设置启动账号和密码,设置为admin/12345678

启动命令为minio.exe server D:\devtool\minioData

默认参数分别为指定文件访问端口为9000,指定服务控制台访问地址端口为9001

启动bat脚本 

访问地址127.0.0.1:9001 账号为admin/12345678

 三、操作介绍

1.创建bucket

 2.创建账号获取access-key 和secret-key

记录下两个key,在代码中使用 

 3.图片上传

访问图片的地址为127.0.0.1:9000/test/130253654639.jpg    ip+端口+buckets+图片名称

调用地址时,返回没权限访问的提示,需要将bucket设置为public权限

 测试访问

 四、linux下使用

下载地址链接: https://pan.baidu.com/s/1zUPjLQPhtY5ZjfeRvKp24g?pwd=w2em 提取码: w2em 

 分别创建储存文件和日志文件,后台启动命令, 其他操作和windows一样

nohup /data/minio/minio server /data/minio/data --address 10.6.49.9:9000 --console-address 10.6.49.9:9001 > /data/minio/logs/log.log 2>&1 &

 五、代码中使用

 1.配置信息 

minio:

  endpoint: http://192.168.16.60:9000

  accesskey: gzh4Alx3Zm5Eceh2

  secretKey: W19q1koRHPhTPWTjulY1Wyvr7b3qAwl7

  bucketName: siping

2.配置类

package com.test.mybatistest.minio;



import io.minio.MinioClient;

import lombok.Data;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.context.annotation.Bean;

import org.springframework.stereotype.Component;



/**

 * minio配置信息

 */

@Data

@Component

@ConfigurationProperties(prefix = "minio")

public class MinioConfig {



    /**

     * 服务器地址

     */

    private String endpoint;



    /**

     * 账号

     */

    private String accessKey;



    /**

     * 密码

     */

    private String secretKey;



    /**

     * 储存桶名称

     */

    private String bucketName;



    @Bean

    public MinioClient minioClient() {

        return MinioClient.builder()

                .endpoint(endpoint)

                .credentials(accessKey, secretKey)

                .build();

    }

}

3.测试类

package com.test.mybatistest.controller;

import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.github.pagehelper.util.StringUtil;
import com.test.mybatistest.minio.MinioConfig;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;

@Api(tags = "Minio")
@RestController
@Slf4j
@RequestMapping("/minio")
public class MinioController {

    @Autowired
    private MinioClient minioClient;


    @Autowired
    private MinioConfig minioConfig;



    @Value("${minio.bucketName}")
    private String bucketName;



    /**
     * 获取文件后缀
     *
     * @param fullName
     * @return
     */
    public static String getFileExtension(String fullName) {
        if (StringUtil.isEmpty(fullName)) return StringPool.EMPTY;
        String fileName = new File(fullName).getName();
        int dotIndex = fileName.lastIndexOf(".");
        return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
    }



    /**
     * 文件上传
     *
     * @param file
     * @return
     */
    @ApiOperation("文件上传-批量")
    @PostMapping("/upload")
    public Object upload(@RequestParam(name = "file", required = false) MultipartFile[] file) {
        if (file == null || file.length == 0) {
            return "上传文件不能为空";
        }
        List<Map<String, Object>> orgfileNameList = new ArrayList<>(file.length);
        for (MultipartFile multipartFile : file) {
            //1.名称
            String orgfileName = multipartFile.getOriginalFilename();
            String fileName = fileName(orgfileName);
            String path = minioConfig.getEndpoint() + '/' + bucketName + '/' + fileName;

            //2.返回信息
            Map<String, Object> fileMap = new HashMap<>();
            fileMap.put("orgName", orgfileName);
            fileMap.put("fileName", fileName);
            fileMap.put("path", path);
            orgfileNameList.add(fileMap);

            //3.文件上传
            try {
                InputStream in = multipartFile.getInputStream();
                minioClient.putObject(
                        PutObjectArgs.builder()
                                .bucket(bucketName)
                                .object(fileName)
                                .stream(in, multipartFile.getSize(), -1)
                                .contentType("application/octet-stream")
                                .build());
                in.close();
            } catch (Exception e) {
                return "上传失败";
            }
        }

        //4.返回
        Map<String, Object> data = new HashMap<>();
        data.put("bucket", bucketName);
        data.put("fileList", orgfileNameList);
        return data;
    }



    /**
     * 生成图片名称
     *
     * @param originalFilename
     * @return
     */
    public String fileName(String originalFilename) {
        StringBuffer sb = new StringBuffer();
        String yyyyMMdd = new SimpleDateFormat("yyyyMMdd").format(new Date());
        ThreadLocalRandom random = ThreadLocalRandom.current();
        String uuid = new UUID(random.nextLong(), random.nextLong()).toString().replace(StringPool.DASH, StringPool.EMPTY);
        sb.append("upload").append("/")
                .append(yyyyMMdd).append("/")
                .append(uuid).append(".")
                .append(getFileExtension(originalFilename));
        return sb.toString();
    }
}

4.测试

5.contentType作用

当contentType设置为application/octet-stream时,访问文件默认为下载

Content-Type:用于向接收方说明传输资源的媒体类型,从而让浏览器用指定码表去解码。

在浏览器中上传时,设置header为application/octet-stream时,在浏览器打开图片链接会默认进行下载而不是在浏览器中加载打开文件,所以如果想要文件时直接打开,上传时则不要设置application/octet-stream

可以用multipartFile获取contentType,也可以通过文件类型获取

可以通过文件后缀设置对应的contentType

package com.test.mybatistest.minio;



import com.github.pagehelper.util.StringUtil;



/**

 * 获取文件的contentType

 */

public enum ViewContentType {

    DEFAULT("default", "application/octet-stream"),

    JPG("jpg", "image/jpeg"),

    TIFF("tiff", "image/tiff"),

    GIF("gif", "image/gif"),

    JFIF("jfif", "image/jpeg"),

    PNG("png", "image/png"),

    TIF("tif", "image/tiff"),

    ICO("ico", "image/x-icon"),

    JPEG("jpeg", "image/jpeg"),

    WBMP("wbmp", "image/vnd.wap.wbmp"),

    FAX("fax", "image/fax"),

    NET("net", "image/pnetvue"),

    JPE("jpe", "image/jpeg"),

    RP("rp", "image/vnd.rn-realpix"),

    DOC("doc", "application/msord"),

    PDF("pdf", "application/pdf");



    private String prefix;



    private String type;



    ViewContentType(String prefix, String type) {

        this.prefix = prefix;

        this.type = type;

    }



    public static String getContentType(String prefix) {

        if (StringUtil.isEmpty(prefix)) {

            return DEFAULT.getType();

        }

        prefix = prefix.substring(prefix.lastIndexOf(".") + 1);

        for (ViewContentType value : ViewContentType.values()) {

            if (prefix.equalsIgnoreCase(value.getPrefix())) {

                return value.getType();

            }

        }

        return DEFAULT.getType();

    }



    public String getPrefix() {

        return prefix;

    }



    public String getType() {

        return type;

    }

}
<think>好的,用户想了解MinIO使用教程,特别是配置和部署方面。让我先回忆一下之前提供的引用内容,看看有哪些相关信息可以整合进去。引用1提到MinIO的安装与配置教程,包括单机和分布式模式。引用2提到了前期准备,比如创建挂载目录、配置docker-compose.yml,还有安装Docker和Docker Compose。引用3则详细介绍了Docker安装MinIO的命令,以及如何通过浏览器访问控制台。 用户的需求可能包括如何快速部署MinIO,配置存储,以及基本操作。我需要分步骤讲解,确保结构清晰。首先应该介绍安装方式,比如Docker部署,这是比较常见的方法。然后配置部分,包括环境变量、数据持久化,还有访问控制台。接下来是部署后的基本操作,比如创建存储桶、上传文件、生成访问链接等。可能还需要提到分布式部署,但用户可能更关注单机部署,所以先详细说明单机,再简要介绍分布式。 需要注意的是,用户可能对Docker不熟悉,所以安装命令要写清楚,并解释每个参数的作用,比如端口映射、数据卷挂载。环境变量MINIO_ROOT_USER和MINIO_ROOT_PASSWORD是必须设置的,要强调这部分的重要性。另外,数据持久化通过-v参数挂载目录,确保容器重启后数据不丢失。 在配置部分,访问控制台需要开放9000和9001端口,用户可能遇到防火墙问题,可以提醒检查端口是否开放。部署后的操作,使用mc命令行工具可能对新手有点难度,但MinIO的UI比较友好,可以重点介绍UI操作,比如创建存储桶、上传文件,生成分享链接等。 可能用户还会关心如何集成到自己的应用中,比如生成访问密钥,但根据问题,可能暂时不需要深入,先满足基础使用。最后,生成相关问题时要考虑用户后续可能遇到的问题,比如性能优化、权限管理、分布式部署细节等。 总之,结构应该分为安装、配置、基本操作、分布式部署简介,每个步骤详细但简洁,确保用户能一步步跟着操作。同时,引用相关的参考资料,帮助用户进一步查阅。需要检查是否符合之前的系统级指令,比如数学公式的格式,但这里可能用不上。确保使用中文,LaTeX正确,问题部分要有三个相关的问题。</think>### MinIO 配置与部署教程 #### 一、安装 MinIO 1. **Docker 部署(推荐)** 使用以下命令通过 Docker 快速启动 MinIO 服务: ```bash docker run -p 9000:9000 -p 9001:9001 \ --name minio \ -d --restart=always \ -e "MINIO_ROOT_USER=minio" \ -e "MINIO_ROOT_PASSWORD=minio123" \ -v /minio/data:/data \ -v /minio/config:/root/.minio \ minio/minio server /data \ --console-address ":9001" --address ":9000" ``` - **参数说明** - `-p 9000:9000`: API 服务端口,用于客户端连接 - `-p 9001:9001`: 控制台端口,用于管理界面 - `-v /minio/data:/data`: 挂载数据目录,确保数据持久化 - `MINIO_ROOT_USER` 和 `MINIO_ROOT_PASSWORD`: 管理员账号密码,必须设置[^3] 2. **二进制文件安装** 从 [MinIO 官网](https://min.io/) 下载对应平台的二进制文件,运行以下命令: ```bash chmod +x minio ./minio server /data --console-address ":9001" ``` --- #### 二、配置与验证 1. **访问控制台** 浏览器打开 `http://服务器IP:9001`,输入设置的账号密码登录控制台。 2. **配置存储桶** - 点击 **Buckets** -> **Create Bucket**,输入存储桶名称(如 `my-bucket`)。 - 设置访问权限:私有(默认)、公开读/写等[^3]。 3. **生成访问密钥** 在控制台的 **Access Keys** 页面创建新的密钥对(Access Key 和 Secret Key),用于客户端(如 SDK、CLI)连接。 --- #### 三、基本操作 1. **使用 `mc` 命令行工具** ```bash # 安装 mc wget https://dl.min.io/client/mc/release/linux-amd64/mc chmod +x mc # 添加 MinIO 服务器别名 ./mc alias set myminio http://服务器IP:9000 minio minio123 # 上传文件到存储桶 ./mc cp myfile.txt myminio/my-bucket ``` 2. **生成临时访问链接** ```bash ./mc share download myminio/my-bucket/myfile.txt ``` --- #### 四、分布式部署(可选) 适用于高可用场景,至少需要4个节点: ```bash docker run -p 9000:9000 -p 9001:9001 \ --name minio \ -d --restart=always \ -e "MINIO_ROOT_USER=minio" \ -e "MINIO_ROOT_PASSWORD=minio123" \ minio/minio server http://node{1...4}/data ``` - **要求**:所有节点时间同步、网络互通,数据目录独立挂载[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值