update code

This commit is contained in:
2024-12-26 13:07:55 +08:00
parent d64e709d3f
commit f77dc396db
4 changed files with 217 additions and 0 deletions

91
fastapiTest.py Normal file
View File

@@ -0,0 +1,91 @@
from fastapi import FastAPI, HTTPException, Response
from minio import Minio
from minio.error import S3Error
from pydantic import BaseModel
from datetime import timedelta
app = FastAPI()
# 初始化 MinIO 客户端
minio_client = Minio(
endpoint="192.168.1.28:9500", # MinIO 服务器地址
access_key="UIiBRvUixj3GkJwvItmy", # Access Key
secret_key="wgIPqYxaNlDhUds0d3n5v57Yvzg3u9iUXplO7Kdm", # Secret Key
secure=False # 如果没有使用 HTTPS则设置为 False
)
# MinIO 配置
BUCKET_NAME = "test-bucket"
class FileRequest(BaseModel):
object_name: str # 文件对象名
expiry_in_seconds: int = 3600 # URL 有效期(默认 1 小时)
@app.post("/download-presigned-url")
def generate_presigned_url(file_request: FileRequest):
"""
生成用于下载文件的预签名 URL
"""
try:
# 检查存储桶是否存在
if not minio_client.bucket_exists(BUCKET_NAME):
raise HTTPException(status_code=404, detail=f"Bucket '{BUCKET_NAME}' does not exist.")
# 检查对象是否存在
try:
minio_client.stat_object(BUCKET_NAME, file_request.object_name)
except S3Error:
raise HTTPException(status_code=404, detail=f"Object '{file_request.object_name}' does not exist.")
# 将秒数转换为 timedelta
expiry_timedelta = timedelta(seconds=file_request.expiry_in_seconds)
# 生成预签名 URL
presigned_url = minio_client.presigned_get_object(
BUCKET_NAME,
file_request.object_name,
expires=expiry_timedelta # 传递 timedelta
)
return {"presigned_url": presigned_url}
except S3Error as e:
raise HTTPException(status_code=500, detail=f"Error generating presigned URL: {e}")
except Exception as e:
raise HTTPException(status_code=500, detail=f"Unexpected error: {e}")
@app.get("/download-file/{object_name:path}")
def download_file(object_name: str):
"""
提供文件对象并直接下载
"""
try:
print(f"Requested object: {object_name}")
# 检查存储桶是否存在
if not minio_client.bucket_exists(BUCKET_NAME):
raise HTTPException(status_code=404, detail=f"Bucket '{BUCKET_NAME}' does not exist.")
# 检查对象是否存在
try:
stat = minio_client.stat_object(BUCKET_NAME, object_name)
except S3Error:
raise HTTPException(status_code=404, detail=f"Object '{object_name}' does not exist.")
# 获取文件对象
response = minio_client.get_object(BUCKET_NAME, object_name)
# 设置响应头
headers = {
"Content-Disposition": f"attachment; filename*=UTF-8''{object_name.split('/')[-1]}",
"Content-Type": stat.content_type
}
return Response(content=response.read(), headers=headers, media_type=stat.content_type)
except S3Error as e:
raise HTTPException(status_code=500, detail=f"Error downloading file: {e}")
except Exception as e:
raise HTTPException(status_code=500, detail=f"Unexpected error: {e}")