Minio python实现文件的上传和下载

文章目录

  • 前言


前言

最后编辑时间为2024-06-21,阅读本文前请注意最后编辑时间,文章内容可能与目前最新的技术发展情况相去甚远。欢迎各位评论与私信,指出错误或是进行交流等。


软件开发工具包sdk文档:
https://minio.org.cn/docs/minio/linux/developers/minio-drivers.html?ref=docs#

Minio python实现文件的上传和下载_第1张图片

官方python api 文档 并给出了解释和例子
https://minio.org.cn/docs/minio/linux/developers/python/API.html

开发环境 python=3.9
minio包根据官方文档 使用 pip install minio 安装

由于需要,实现了对官方api的进一步改动。
如果还需要拓展其他功能,可以参考官方api文档
如需用其他语言开发请自行查阅资料
代码如下

from minio import Minio, InvalidResponseError, S3Error


# MinIO使用bucket(桶)来组织对象。
# bucket类似于文件夹或目录,其中每个bucket可以容纳任意数量的对象。
class Bucket:

    def __init__(self, minio_address, minio_admin, minio_password):
        # 通过ip 账号 密码 连接minio server
        # Http连接 将secure设置为False
        self.minioClient = Minio(endpoint=minio_address,
                                 access_key=minio_admin,
                                 secret_key=minio_password,
                                 secure=False)

    def create_one_bucket(self, bucket_name):
        # 创建桶(调用make_bucket api来创建一个桶)
        """
        桶命名规则:小写字母,句点,连字符和数字 允许使用 长度至少3个字符
        使用大写字母、下划线等会报错
        """
        try:
            # bucket_exists:检查桶是否存在
            if self.minioClient.bucket_exists(bucket_name=bucket_name):
                print("该存储桶已经存在")
            else:
                self.minioClient.make_bucket(bucket_name=bucket_name)
                print(f"{bucket_name}桶创建成功")
        except InvalidResponseError as err:
            print(err)

    def remove_one_bucket(self, bucket_name):
        # 删除桶(调用remove_bucket api来创建一个存储桶)
        try:
            if self.minioClient.bucket_exists(bucket_name=bucket_name):
                self.minioClient.remove_bucket(bucket_name)
                print("删除存储桶成功")
            else:
                print("该存储桶不存在")
        except InvalidResponseError as err:
            print(err)

    def upload_file_to_bucket(self, bucket_name, file_name, file_path):
        """
        将文件上传到bucket
        :param bucket_name: minio桶名称
        :param file_name: 存放到minio桶中的文件名字(相当于对文件进行了重命名,可以与原文件名不同)
                            file_name处可以创建新的目录(文件夹) 例如 /example/file_name
                            相当于在该桶中新建了一个example文件夹 并把文件放在其中
        :param file_path: 本地文件的路径
        """
        # 桶是否存在 不存在则新建
        check_bucket = self.minioClient.bucket_exists(bucket_name)
        if not check_bucket:
            self.minioClient.make_bucket(bucket_name)

        try:
            self.minioClient.fput_object(bucket_name=bucket_name,
                                         object_name=file_name,
                                         file_path=file_path)
        except FileNotFoundError as err:
            print('upload_failed: ' + str(err))
        except S3Error as err:
            print("upload_failed:", err)

    def download_file_from_bucket(self, bucket_name, minio_file_path, download_file_path):
        """
        从bucket下载文件
        :param bucket_name: minio桶名称
        :param minio_file_path: 存放在minio桶中文件名字
                            file_name处可以包含目录(文件夹) 例如 /example/file_name
        :param download_file_path: 文件获取后存放的路径
        """
        # 桶是否存在
        check_bucket = self.minioClient.bucket_exists(bucket_name)
        if check_bucket:
            try:
                self.minioClient.fget_object(bucket_name=bucket_name,
                                             object_name=minio_file_path,
                                             file_path=download_file_path)
            except FileNotFoundError as err:
                print('download_failed: ' + str(err))
            except S3Error as err:
                print("download_failed:", err)

    def remove_object(self, bucket_name, object_name):
        """
        从bucket删除文件
        :param bucket_name: minio桶名称
        :param object_name: 存放在minio桶中的文件名字
                            object_name处可以包含目录(文件夹) 例如 /example/file_name
        """
        # 桶是否存在
        check_bucket = self.minioClient.bucket_exists(bucket_name)
        if check_bucket:
            try:
                self.minioClient.remove_object(bucket_name=bucket_name,
                                               object_name=object_name)
            except FileNotFoundError as err:
                print('upload_failed: ' + str(err))
            except S3Error as err:
                print("upload_failed:", err)

    # 获取所有的桶
    def get_all_bucket(self):
        buckets = self.minioClient.list_buckets()
        ret = []
        for _ in buckets:
            ret.append(_.name)
        return ret

    # 获取一个桶中的所有一级目录和文件
    def get_list_objects_from_bucket(self, bucket_name):
        # 桶是否存在
        check_bucket = self.minioClient.bucket_exists(bucket_name)
        if check_bucket:
            # 获取到该桶中的所有目录和文件
            objects = self.minioClient.list_objects(bucket_name=bucket_name)
            ret = []
            for _ in objects:
                ret.append(_.object_name)
            return ret

    # 获取桶里某个目录下的所有目录和文件
    def get_list_objects_from_bucket_dir(self, bucket_name, dir_name):
        # 桶是否存在
        check_bucket = self.minioClient.bucket_exists(bucket_name)
        if check_bucket:
            # 获取到bucket_name桶中的dir_name下的所有目录和文件
            # prefix 获取的文件路径需包含该前缀
            objects = self.minioClient.list_objects(bucket_name=bucket_name,
                                                    prefix=dir_name,
                                                    recursive=True)
            ret = []
            for _ in objects:
                ret.append(_.object_name)
            return ret


if __name__ == "__main__":
    # 本地minio登录IP地址和账号密码
    minio_address = "127.0.0.1:9000"
    minio_admin = "minioadmin"
    minio_password = "minioadmin"

    bucket = Bucket(minio_address=minio_address,
                    minio_admin=minio_admin,
                    minio_password=minio_password)
    # 创建桶测试
    # bucket.create_one_bucket('test1')

    # 删除桶测试
    # bucket.remove_one_bucket('test1')

    # 上传文件测试
    # bucket.upload_file_to_bucket('test1', '1.jpg', './1.jpg')
    # bucket.upload_file_to_bucket('test1', '/example/1.jpg', './1.jpg')

    # 删除文件测试
    # bucket.remove_object('test1', '1.jpg')
    # bucket.remove_object('test', '/example/1.jpg')

    # 下载图像测试
    # bucket.download_file_from_bucket('test1', 'example/1.jpg', './1.jpg')

    # 获取所有的桶
    # ret = bucket.get_all_bucket()
    # print(ret)

    # 获取一个桶中的所有一级目录和文件
    # ret = bucket.get_list_objects_from_bucket(bucket_name='test')
    # print(ret)

    # 获取一个桶中的某目录下的所有文件
    # ret = bucket.get_list_objects_from_bucket_dir('test', 'example/')
    # print(ret)

可在本地运行minio服务 然后对代码进行测试

你可能感兴趣的:(python,开发语言,经验分享)