You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
7.0 KiB
178 lines
7.0 KiB
1 month ago
|
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)
|
||
|
|