159 lines
5.6 KiB
Python
159 lines
5.6 KiB
Python
|
|
import time
|
|||
|
|
|
|||
|
|
from minio import Minio
|
|||
|
|
from minio.error import S3Error
|
|||
|
|
import os
|
|||
|
|
|
|||
|
|
from middleware.util import get_current_date_and_milliseconds
|
|||
|
|
|
|||
|
|
client = Minio(
|
|||
|
|
endpoint="222.212.85.86:9000", # MinIO 服务器地址
|
|||
|
|
access_key="adminjdskfj", # 替换为你的 Access Key
|
|||
|
|
secret_key="123456ksldjfal@Y", # 替换为你的 Secret Key
|
|||
|
|
secure=False # 如果未启用 HTTPS 则设为 False
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
bucket_name = "300bdf2b-a150-406e-be63-d28bd29b409f" # 你的桶名称
|
|||
|
|
|
|||
|
|
first_dir='ai_result'
|
|||
|
|
|
|||
|
|
def create_bucket():
|
|||
|
|
'''
|
|||
|
|
访问 MinIO 服务器,打印存储桶
|
|||
|
|
'''
|
|||
|
|
try:
|
|||
|
|
buckets = client.list_buckets()
|
|||
|
|
for bucket in buckets:
|
|||
|
|
print(f"Bucket: {bucket.name}, Created: {bucket.creation_date}")
|
|||
|
|
except S3Error as e:
|
|||
|
|
print(f"Error: {e}")
|
|||
|
|
|
|||
|
|
|
|||
|
|
def downFile(object_name):
|
|||
|
|
global bucket_name
|
|||
|
|
print("1")
|
|||
|
|
current_directory = os.path.dirname(os.path.abspath(__file__))
|
|||
|
|
print("2")
|
|||
|
|
download_path = os.path.join(current_directory, os.path.basename(object_name)) # 仅保留文件名
|
|||
|
|
print("3")
|
|||
|
|
try:
|
|||
|
|
print("4")
|
|||
|
|
os.makedirs(os.path.dirname(download_path), exist_ok=True)
|
|||
|
|
print("5")
|
|||
|
|
client.fget_object(bucket_name, object_name, download_path)
|
|||
|
|
print(f"文件已下载到 {download_path}")
|
|||
|
|
return download_path
|
|||
|
|
except S3Error as e:
|
|||
|
|
print(f"MinIO 错误: {e}")
|
|||
|
|
except OSError as e:
|
|||
|
|
print(f"本地文件系统错误: {e}")
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
|
|||
|
|
def upload_folder(folder_path, bucket_directory):
|
|||
|
|
"""
|
|||
|
|
上传文件夹中的所有文件到 MinIO 指定目录
|
|||
|
|
:param folder_path: 本地文件夹路径
|
|||
|
|
:param bucket_name: MinIO 存储桶名称
|
|||
|
|
:param bucket_directory: MinIO 存储桶内的目标目录(可选)
|
|||
|
|
"""
|
|||
|
|
# 要下载的桶名和对象名
|
|||
|
|
global bucket_name,first_dir
|
|||
|
|
try:
|
|||
|
|
# 确保存储桶存在
|
|||
|
|
if not client.bucket_exists(bucket_name):
|
|||
|
|
print(f"存储桶 {bucket_name} 不存在")
|
|||
|
|
|
|||
|
|
# 遍历文件夹中的所有文件
|
|||
|
|
for root, _, files in os.walk(folder_path):
|
|||
|
|
for file in files:
|
|||
|
|
file_path = os.path.join(root, file)
|
|||
|
|
object_name = os.path.relpath(file_path, folder_path).replace("\\", "/") # 适配 Windows/Linux
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 如果指定了桶目录,则添加前缀
|
|||
|
|
if bucket_directory:
|
|||
|
|
object_name = f"{bucket_directory.rstrip('/')}/{first_dir}/{object_name}"
|
|||
|
|
|
|||
|
|
# 上传文件
|
|||
|
|
client.fput_object(bucket_name, object_name, file_path)
|
|||
|
|
print(f"文件 {file_path} 已上传至 {bucket_name}/{object_name}")
|
|||
|
|
except S3Error as e:
|
|||
|
|
print(f"上传文件夹时出错: {e}")
|
|||
|
|
|
|||
|
|
|
|||
|
|
def upload_file(file_path, bucket_directory):
|
|||
|
|
"""
|
|||
|
|
上传文件到 MinIO 指定目录
|
|||
|
|
:param file_path: 本地文件路径
|
|||
|
|
:param bucket_name: MinIO 存储桶名称
|
|||
|
|
:param bucket_directory: MinIO 存储桶内的目标目录(可选)
|
|||
|
|
"""
|
|||
|
|
# 要下载的桶名和对象名
|
|||
|
|
# bucket_name = "300bdf2b-a150-406e-be63-d28bd29b409f" # 你的桶名称
|
|||
|
|
global bucket_name,first_dir
|
|||
|
|
# dir_name = "ai_result"
|
|||
|
|
try:
|
|||
|
|
# 确保存储桶存在
|
|||
|
|
if not client.bucket_exists(bucket_name):
|
|||
|
|
print(f"存储桶 {bucket_name} 不存在")
|
|||
|
|
|
|||
|
|
# 获取文件名
|
|||
|
|
file_name = os.path.basename(file_path)
|
|||
|
|
|
|||
|
|
formatted_date, milliseconds_timestamp = get_current_date_and_milliseconds()
|
|||
|
|
# 如果指定了桶目录,则添加前缀
|
|||
|
|
if bucket_directory:
|
|||
|
|
object_name = f"{first_dir}/{str(formatted_date)}/{str(milliseconds_timestamp)}-{file_name}"
|
|||
|
|
else:
|
|||
|
|
object_name = f"{first_dir}/{str(formatted_date)}/{str(milliseconds_timestamp)}-{file_name}"
|
|||
|
|
|
|||
|
|
# 上传文件
|
|||
|
|
client.fput_object(bucket_name, object_name, file_path)
|
|||
|
|
print(f"文件 {file_path} 已上传至 {bucket_name}/{object_name}")
|
|||
|
|
return object_name, "pic"
|
|||
|
|
except S3Error as e:
|
|||
|
|
print(f"上传文件时出错: {e}")
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 将内存中的缓存,直接上传minio,不做本地存储
|
|||
|
|
def upload_file_from_buffer(buffer,file_name, bucket_directory=None):
|
|||
|
|
"""
|
|||
|
|
上传二进制流到 MinIO 指定目录
|
|||
|
|
:param buffer: BytesIO 对象,包含要上传的二进制数据
|
|||
|
|
:param bucket_name: MinIO 存储桶名称
|
|||
|
|
:param bucket_directory: MinIO 存储桶内的目标目录(可选)
|
|||
|
|
"""
|
|||
|
|
# bucket_name = "300bdf2b-a150-406e-be63-d28bd29b409f" # 你的桶名称
|
|||
|
|
# dir_name = "ai_result"
|
|||
|
|
global bucket_name, first_dir
|
|||
|
|
try:
|
|||
|
|
# 确保存储桶存在
|
|||
|
|
if not client.bucket_exists(bucket_name):
|
|||
|
|
print(f"存储桶 {bucket_name} 不存在")
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
# 获取文件名(如果没有指定目录,则使用默认文件名)
|
|||
|
|
# file_name = "uploaded_file.png" # 默认文件名,可以根据需要修改
|
|||
|
|
|
|||
|
|
# 如果指定了桶目录,则添加前缀
|
|||
|
|
if bucket_directory:
|
|||
|
|
object_name = f"{first_dir}/{bucket_directory.rstrip('/')}/{file_name}"
|
|||
|
|
else:
|
|||
|
|
object_name = f"{first_dir}/{file_name}"
|
|||
|
|
|
|||
|
|
# 上传二进制流
|
|||
|
|
# 注意:buffer.getvalue() 返回二进制数据
|
|||
|
|
client.put_object(
|
|||
|
|
bucket_name=bucket_name,
|
|||
|
|
object_name=object_name,
|
|||
|
|
data=buffer,
|
|||
|
|
length=buffer.getbuffer().nbytes,
|
|||
|
|
content_type="image/png" # 根据实际内容类型设置
|
|||
|
|
)
|
|||
|
|
print(f"二进制流已上传至 {bucket_name}/{object_name}")
|
|||
|
|
return object_name, "pic"
|
|||
|
|
except S3Error as e:
|
|||
|
|
print(f"上传二进制流时出错: {e}")
|
|||
|
|
return None
|