首页 > 其他分享 >minio

minio

时间:2023-06-14 14:00:32浏览次数:43  
标签:minio self object bucket path name

minio

1. 使用下列文件开启服务

minio.exe

2. 修改密码及开启服务

第一步,找到minio.exe所在目录,进入cmd窗口。

第二步,输入set MINIO_ACCESS_KEY=admin命令,修改ACCESS-KEY。

第三步,输入set MINIO_SECRET_KEY=12345678命令,修改 SECRET-KEY。

第四步,输入minio.exe server D:\minio,启动minio。

3.说明

4.操作类

minio_oss.py

import io
import re
import os
import logging
import mimetypes
import urllib.parse

from minio import Minio
from io import IOBase

_logger = logging.getLogger(__name__)


class BaseMinioError(Exception):
    code = "BaseMinioError"
    message = ""

    def __init__(self, func, *args, **kwargs):
        self.func = func.func.__name__  # 偏函数.func.__main__ 是实际调用的对象名称
        self.args = args
        self.kwargs = kwargs

    def __str__(self):
        return f"{self.code}:{self.message},func:{self.func},args:{self.args},kwargs:{self.kwargs}"


class ObjectTypeError(BaseMinioError):
    code = "ObjectTypeError"
    message = "The data must be 'str'/'bytes'/'IO object' "

    def __init__(self):
        pass

    def __str__(self):
        return f"{self.code}:{self.message}"


class NoSuchKey(BaseMinioError):
    code = "NoSuchKey"
    message = "Object does not exist"


class DataDecorator(object):
    def __init__(self, data):
        try:
            self.data = data.encode("utf8")
        except AttributeError:
            self.data = data

    def read(self, size: int = 0):
        if not size:
            return self.data
        return self.data[0:size]


_EXTRA_TYPES_MAP = {
    ".js": "application/javascript",
    ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    ".xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
    ".potx": "application/vnd.openxmlformats-officedocument.presentationml.template",
    ".ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
    ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
    ".sldx": "application/vnd.openxmlformats-officedocument.presentationml.slide",
    ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
    ".dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
    ".xlam": "application/vnd.ms-excel.addin.macroEnabled.12",
    ".xlsb": "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
    ".apk": "application/vnd.android.package-archive",
    # ".pdf": "application/pdf",
}


def content_type_by_name(name):
    """根据文件名,返回Content-Type。"""
    ext = os.path.splitext(name)[1].lower()
    if ext in _EXTRA_TYPES_MAP:
        return _EXTRA_TYPES_MAP[ext]

    return mimetypes.guess_type(name)[0]


class MinioOss:
    def __init__(self, host, access_key, secret_key, bucket, model_dirs):
        self.host = host
        self.access_key = access_key
        self.secret_key = secret_key
        self.secure = False
        self.bucket = bucket
        self.model_dirs = model_dirs
        self.client = Minio(
            self.host,
            secure=self.secure,
            access_key=self.access_key,
            secret_key=self.secret_key,
        )

    def __new__(cls, *args, **kw):
        """
        单例
        """
        if not hasattr(cls, 'instance'):
            cls.instance = super(MinioOss, cls).__new__(cls)
        return cls.instance

    def parse_path(self, path):
        """
        @param path:文件路径
        @return:
        """
        if path.startswith("/"):
            return f"{self.model_dirs}{path}"
        else:
            return f"{self.model_dirs}/{path}"

    def object_exists(self, bucket_name, path: str) -> bool:
        """
        判断文件是否存在
        @param path: 文件路径
        @return:
        """
        path = self.parse_path(path)

        try:
            self.client.stat_object(bucket_name, path)
        except NoSuchKey:
            return False

        return True

    def upload(self, object_name, raw_data, length):
        """
        上传IO流到Minio
        @param object_name: 对象在桶中的名字
        @param raw_data: An object having callable read() returning bytes object
        @param expire: 过期时间 单位:s
        @param length: 文件大小
        @return:
        """
        object_name = self.parse_path(object_name)
        # 当上传数据不是 str bytes 和IO对象时报错
        if not isinstance(raw_data, (IOBase, str, bytes)):
            raise ObjectTypeError()

        if not isinstance(raw_data, IOBase):
            raw_data = DataDecorator(raw_data)

        found = self.client.bucket_exists(self.bucket)
        if not found:
            self.client.make_bucket(self.bucket)
            _logger.info(f'create {self.bucket} sucess!')

        return self.client.put_object(
            bucket_name=self.bucket, object_name=object_name, data=raw_data, length=length,
            content_type=content_type_by_name(object_name)
        )

    def upload_file(self, object_name, file_name):
        """
        上传文件到Minio
        @param object_name: 桶里面的对象名
        @param file_name: 上传的文件名
        @return:
        """
        object_name = self.parse_path(object_name)

        found = self.client.bucket_exists(self.bucket)
        if not found:
            self.client.make_bucket(self.bucket)
            _logger.info(f'create {self.bucket} sucess!')

        self.client.fput_object(
            self.bucket, object_name, file_name, content_type=content_type_by_name(object_name))

    def download_url(self, object_name):
        """
        获取minio文件下载地址
        @param object_name: 桶里面的对象名
        @return:
        """
        if re.findall('[\u4e00-\u9fa5]', object_name):
            # 当文件名为中文时,minio会自己转换,无需再通过urllib.parse.quote转换
            return self.client.presigned_get_object(self.bucket, self.parse_path(object_name))
        return self.client.presigned_get_object(self.bucket, urllib.parse.quote(self.parse_path(object_name)))

    def delete(self, object_name):
        path = self.parse_path(object_name)
        self.client.remove_object(self.bucket, path)

引入上述类和minio交互,示例:

import os
from minuio_case.minio_oss import MinioOss


MINIO_CONF = {
    'host': '127.0.0.1:9000', # minio地址
    'access_key': 'minioadmin', # 账号
    'secret_key': 'minioadmin', # 密码
    'bucket': 'buckets1', # 桶
    'model_dirs': r'xcj' # 桶的文件夹
}

# 文件地址
file_path = r'E:\workspace\project\tools\tools\pdf\明天.pdf'

# 打开文件
with open(file_path, 'rb') as file:
    # 读取文件流
    content = file.read()
    
# 获取文件大小
file_size = os.path.getsize(file_path)

# 根据配置字典连接minio
minio_vessel = MinioOss(**MINIO_CONF)

# 上传本地文件
minio_vessel.upload_file('folder/明天.pdf',r'E:\workspace\project\tools\tools\pdf\明天.pdf')

# 上传文件流
minio_vessel.upload('folder/明天.pdf',content,file_size)

# 获取预览地址
preview_url = minio_vessel.preview_url("folder/明天.pdf")

作者:张猛

标签:minio,self,object,bucket,path,name
From: https://www.cnblogs.com/DTCLOUD/p/17479988.html

相关文章

  • minio分布式文件存储系统
    1什么是minio?MinlO是一个基于ApacheLicensev2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据。例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。MinlO是一个非常轻量的......
  • windows下使用minio搭建s3存储,使用laravel和postman进行测试
    1、下载服务端https://dl.min.io/server/minio/release/windows-amd64/minio.exe2、启动服务minio.exeserverd:\data\minio--console-address:9090 可以看到上面有两块ip,分别是9000和9000端口,其中9090是后台管理端地址的端口,9000是前台接口端口3、创建bucket4......
  • go调用minio上传文件
    1packagemain23import(4"context"5"fmt"6"log"7"os"89"github.com/minio/minio-go/v7"10"github.com/minio/minio-go/v7/pkg/credentials"11)1213......
  • 文件minio进阶 分页查询
    文章目录前言一、minio使用二、代码1.mino版本是最新的,那么pom中也要最新的2.部分代码总结前言就是现在通过minio管理文件,然后不需要其他信息,所以我也就没有用传统方式,在mysql中做文件记录,直接用minio做了文件存储,以及文件查询;一、minio使用1docker安装最新版minio.开......
  • minio查询桶中文件,桶目录中文件
    文章目录前言一、文件桶中的文件夹是什么?二、文件查询1.桶中文件查询2.桶中文件夹中的文件查询总结前言文章再续,书接上文minio进阶分页查询说到了文件,可以实现分页查询,然后上次查询的是桶中的文件列表,这次遇到了需要数据隔离的文件,也就是需要在桶中再次建立文件夹;然后查......
  • 对象存储服务-Minio
    对象存储服务(ObjectStorageService,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。对象存储服务在项目开发过程中,我们会产生大量的对象数据,包括:日志文件,数据库脚本文件、安装包,容器镜像,图......
  • 对象存储服务-Minio
    Mino目录Mino对象存储服务Minio参考Minio架构为什么要用Minio存储机制纠删码MinIO概念部署单机部署:Docker部署Minio分布式MinioMinio配置如何存储和访问对象MinIOClient(mc)命令使用通过代码存储对象对象存储服务(ObjectStorageService,OSS)是一种海量、安全、低成......
  • 通过ftp & sftp 进行minio 管理
    minio4.20发布的版本支持基于ftp以及sftp进行minio管理了,对于一些业务需要使用ftp以及sftp的就比较方便了我们同时可以使用多协议模式进行minio访问了参考使用docker-compose version:'3'services:app:image:minio/minio:RELEASE.2023-06-02T23-17-26Z.fipscommand:......
  • 通过ftp & sftp 进行minio 管理
    minio4.20发布的版本支持基于ftp以及sftp进行minio管理了,对于一些业务需要使用ftp以及sftp的就比较方便了我们同时可以使用多协议模式进行minio访问了参考使用docker-compose version:'3'services:app:image:minio/minio:RELEASE.2......
  • python之minio基础操作(二)
    fromminioimportMiniofrommultiprocessingimportProcessimporttimedefupload_file():#创建minio客户端client=Minio(endpoint="xxx.xxx.xxx.xxx:xxx",access_key='xxx',secret_key='x......