mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-09-24 13:37:13 +00:00
2、后端过滤数据权限优化逻辑 3、获取在线用户缓存crud中keys变为*keys 4、前端状态查询修订 5、前端文件管理列表修订icon控制台警告 6、前端布局页面通知公告信息对接后端完成
194 lines
6.3 KiB
Python
194 lines
6.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import os
|
|
from minio import Minio
|
|
from minio.error import S3Error
|
|
from datetime import timedelta
|
|
from minio.deleteobjects import DeleteObject
|
|
|
|
class Bucket(object):
|
|
client = None
|
|
policy = '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":["*"]},"Action":["s3:GetBucketLocation","s3:ListBucket"],"Resource":["arn:aws:s3:::%s"]},{"Effect":"Allow","Principal":{"AWS":["*"]},"Action":["s3:GetObject"],"Resource":["arn:aws:s3:::%s/*"]}]}'
|
|
def __new__(cls, *args, **kwargs):
|
|
if not cls.client:
|
|
cls.client = object.__new__(cls)
|
|
return cls.client
|
|
def __init__(self, service, access_key, secret_key, secure=False):
|
|
self.service = service
|
|
self.client = Minio(service, access_key=access_key, secret_key=secret_key, secure=secure)
|
|
def exists_bucket(self, bucket_name):
|
|
"""
|
|
判断桶是否存在
|
|
:param bucket_name: 桶名称
|
|
:return:
|
|
"""
|
|
return self.client.bucket_exists(bucket_name=bucket_name)
|
|
def create_bucket(self, bucket_name:str, is_policy:bool=True):
|
|
"""
|
|
创建桶 + 赋予策略
|
|
:param bucket_name: 桶名
|
|
:param is_policy: 策略
|
|
:return:
|
|
"""
|
|
if self.exists_bucket(bucket_name=bucket_name):
|
|
return False
|
|
else:
|
|
self.client.make_bucket(bucket_name = bucket_name)
|
|
if is_policy:
|
|
policy = self.policy % (bucket_name, bucket_name)
|
|
self.client.set_bucket_policy(bucket_name=bucket_name, policy=policy)
|
|
return True
|
|
|
|
def get_bucket_list(self):
|
|
"""
|
|
列出存储桶
|
|
:return:
|
|
"""
|
|
buckets = self.client.list_buckets()
|
|
bucket_list = []
|
|
for bucket in buckets:
|
|
bucket_list.append(
|
|
{"bucket_name": bucket.name, "create_time": bucket.creation_date}
|
|
)
|
|
return bucket_list
|
|
|
|
def remove_bucket(self, bucket_name):
|
|
"""
|
|
删除桶
|
|
:param bucket_name:
|
|
:return:
|
|
"""
|
|
try:
|
|
self.client.remove_bucket(bucket_name=bucket_name)
|
|
except S3Error as e:
|
|
print("[error]:", e)
|
|
return False
|
|
return True
|
|
def bucket_list_files(self, bucket_name, prefix):
|
|
"""
|
|
列出存储桶中所有对象
|
|
:param bucket_name: 同名
|
|
:param prefix: 前缀
|
|
:return:
|
|
"""
|
|
try:
|
|
files_list = self.client.list_objects(bucket_name=bucket_name, prefix=prefix, recursive=True)
|
|
for obj in files_list:
|
|
print(obj.bucket_name, obj.object_name.encode('utf-8'), obj.last_modified,
|
|
obj.etag, obj.size, obj.content_type)
|
|
except S3Error as e:
|
|
print("[error]:", e)
|
|
def bucket_policy(self, bucket_name):
|
|
"""
|
|
列出桶存储策略
|
|
:param bucket_name:
|
|
:return:
|
|
"""
|
|
try:
|
|
policy = self.client.get_bucket_policy(bucket_name)
|
|
except S3Error as e:
|
|
print("[error]:", e)
|
|
return None
|
|
return policy
|
|
|
|
def download_file(self, bucket_name, file, file_path, stream=1024*32):
|
|
"""
|
|
从bucket 下载文件 + 写入指定文件
|
|
:return:
|
|
"""
|
|
try:
|
|
data = self.client.get_object(bucket_name, file)
|
|
with open(file_path, "wb") as fp:
|
|
for d in data.stream(stream):
|
|
fp.write(d)
|
|
except S3Error as e:
|
|
print("[error]:", e)
|
|
def fget_file(self, bucket_name, file, file_path):
|
|
"""
|
|
下载保存文件保存本地
|
|
:param bucket_name:
|
|
:param file:
|
|
:param file_path:
|
|
:return:
|
|
"""
|
|
self.client.fget_object(bucket_name, file, file_path)
|
|
def copy_file(self, bucket_name, file, file_path):
|
|
"""
|
|
拷贝文件(最大支持5GB)
|
|
:param bucket_name:
|
|
:param file:
|
|
:param file_path:
|
|
:return:
|
|
"""
|
|
self.client.copy_object(bucket_name, file, file_path)
|
|
def upload_file(self,bucket_name, file, file_path, content_type):
|
|
"""
|
|
上传文件 + 写入
|
|
:param bucket_name: 桶名
|
|
:param file: 文件名
|
|
:param file_path: 本地文件路径
|
|
:param content_type: 文件类型
|
|
:return:
|
|
"""
|
|
try:
|
|
with open(file_path, "rb") as file_data:
|
|
file_stat = os.stat(file_path)
|
|
self.client.put_object(bucket_name, file, file_data, file_stat.st_size, content_type=content_type)
|
|
except S3Error as e:
|
|
print("[error]:", e)
|
|
def fput_file(self, bucket_name, file, file_path):
|
|
"""
|
|
上传文件
|
|
:param bucket_name: 桶名
|
|
:param file: 文件名
|
|
:param file_path: 本地文件路径
|
|
:return:
|
|
"""
|
|
try:
|
|
self.client.fput_object(bucket_name, file, file_path)
|
|
except S3Error as e:
|
|
print("[error]:", e)
|
|
|
|
def stat_object(self, bucket_name, file):
|
|
"""
|
|
获取文件元数据
|
|
:param bucket_name:
|
|
:param file:
|
|
:return:
|
|
"""
|
|
try:
|
|
data = self.client.stat_object(bucket_name, file)
|
|
print(data.bucket_name)
|
|
print(data.object_name)
|
|
print(data.last_modified)
|
|
print(data.etag)
|
|
print(data.size)
|
|
print(data.metadata)
|
|
print(data.content_type)
|
|
except S3Error as e:
|
|
print("[error]:", e)
|
|
def remove_file(self, bucket_name, file):
|
|
"""
|
|
移除单个文件
|
|
:return:
|
|
"""
|
|
self.client.remove_object(bucket_name, file)
|
|
def remove_files(self, bucket_name, file_list):
|
|
"""
|
|
删除多个文件
|
|
:return:
|
|
"""
|
|
delete_object_list = [DeleteObject(file) for file in file_list]
|
|
for del_err in self.client.remove_objects(bucket_name, delete_object_list):
|
|
print("del_err", del_err)
|
|
def presigned_get_file(self, bucket_name, file, days=7):
|
|
"""
|
|
生成一个http GET操作 签证URL
|
|
:return:
|
|
"""
|
|
return self.client.presigned_get_object(bucket_name, file, expires=timedelta(days=days))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
minio_obj = Bucket(service="10.0.0.70:9000", access_key="xujunkai", secret_key="12345678")
|