125 lines
3.8 KiB
Python
125 lines
3.8 KiB
Python
"""
|
||
为指定的文件路径生成 MinIO 预签名下载 URL
|
||
"""
|
||
import sys
|
||
import io
|
||
from minio import Minio
|
||
from datetime import timedelta
|
||
|
||
# 设置输出编码为UTF-8,避免Windows控制台编码问题
|
||
if sys.platform == 'win32':
|
||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
|
||
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
|
||
|
||
# MinIO连接配置
|
||
MINIO_CONFIG = {
|
||
'endpoint': 'minio.datacubeworld.com:9000',
|
||
'access_key': 'JOLXFXny3avFSzB0uRA5',
|
||
'secret_key': 'G1BR8jStNfovkfH5ou39EmPl34E4l7dGrnd3Cz0I',
|
||
'secure': True
|
||
}
|
||
|
||
BUCKET_NAME = 'finyx'
|
||
|
||
# 文件相对路径列表
|
||
FILE_PATHS = [
|
||
'/615873064429507639/20251211112544/初步核实审批表_张三.docx',
|
||
'/615873064429507639/20251211112545/请示报告卡_张三.docx'
|
||
]
|
||
|
||
def generate_download_urls():
|
||
"""为文件路径列表生成下载 URL"""
|
||
print("="*80)
|
||
print("生成 MinIO 下载链接")
|
||
print("="*80)
|
||
|
||
try:
|
||
# 创建MinIO客户端
|
||
client = Minio(
|
||
MINIO_CONFIG['endpoint'],
|
||
access_key=MINIO_CONFIG['access_key'],
|
||
secret_key=MINIO_CONFIG['secret_key'],
|
||
secure=MINIO_CONFIG['secure']
|
||
)
|
||
|
||
print(f"\n存储桶: {BUCKET_NAME}")
|
||
print(f"端点: {MINIO_CONFIG['endpoint']}")
|
||
print(f"使用HTTPS: {MINIO_CONFIG['secure']}\n")
|
||
|
||
results = []
|
||
|
||
for file_path in FILE_PATHS:
|
||
# 去掉开头的斜杠,得到对象名称
|
||
object_name = file_path.lstrip('/')
|
||
|
||
print("-"*80)
|
||
print(f"文件: {file_path}")
|
||
print(f"对象名称: {object_name}")
|
||
|
||
try:
|
||
# 检查文件是否存在
|
||
stat = client.stat_object(BUCKET_NAME, object_name)
|
||
print(f"[OK] 文件存在")
|
||
print(f" 文件大小: {stat.size:,} 字节")
|
||
print(f" 最后修改: {stat.last_modified}")
|
||
|
||
# 生成预签名URL(7天有效期)
|
||
url = client.presigned_get_object(
|
||
BUCKET_NAME,
|
||
object_name,
|
||
expires=timedelta(days=7)
|
||
)
|
||
|
||
print(f"[OK] 预签名URL生成成功(7天有效)")
|
||
print(f"\n下载链接:")
|
||
print(f"{url}\n")
|
||
|
||
results.append({
|
||
'file_path': file_path,
|
||
'object_name': object_name,
|
||
'url': url,
|
||
'size': stat.size,
|
||
'exists': True
|
||
})
|
||
|
||
except Exception as e:
|
||
print(f"[ERROR] 错误: {e}\n")
|
||
results.append({
|
||
'file_path': file_path,
|
||
'object_name': object_name,
|
||
'url': None,
|
||
'exists': False,
|
||
'error': str(e)
|
||
})
|
||
|
||
# 输出汇总
|
||
print("\n" + "="*80)
|
||
print("下载链接汇总")
|
||
print("="*80)
|
||
|
||
for i, result in enumerate(results, 1):
|
||
print(f"\n{i}. {result['file_path']}")
|
||
if result['exists']:
|
||
print(f" [OK] 文件存在")
|
||
print(f" 下载链接: {result['url']}")
|
||
else:
|
||
print(f" [ERROR] 文件不存在或无法访问")
|
||
if 'error' in result:
|
||
print(f" 错误: {result['error']}")
|
||
|
||
print("\n" + "="*80)
|
||
print("完成")
|
||
print("="*80)
|
||
|
||
return results
|
||
|
||
except Exception as e:
|
||
print(f"\n[ERROR] 连接MinIO失败: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
return None
|
||
|
||
if __name__ == '__main__':
|
||
generate_download_urls()
|
||
|