This commit is contained in:
aaron 2025-01-20 12:51:09 +08:00
parent 2011505131
commit 78f3f91abb
3 changed files with 80 additions and 9 deletions

View File

@ -2,7 +2,7 @@ from fastapi import APIRouter, UploadFile, File, Depends
from typing import List from typing import List
import uuid import uuid
from datetime import datetime from datetime import datetime
from app.core.cos import cos_client from app.core.cos import cos_manager
from app.core.config import settings from app.core.config import settings
from app.models.upload import UploadResponse, MultiUploadResponse from app.models.upload import UploadResponse, MultiUploadResponse
from app.core.response import success_response, error_response, ResponseModel from app.core.response import success_response, error_response, ResponseModel
@ -18,7 +18,7 @@ async def upload_to_cos(file: UploadFile) -> str:
filename = f"{datetime.now().strftime('%Y%m%d')}/{uuid.uuid4()}.{ext}" filename = f"{datetime.now().strftime('%Y%m%d')}/{uuid.uuid4()}.{ext}"
# 上传文件 # 上传文件
cos_client.put_object( cos_manager.put_object(
Bucket=settings.COS_BUCKET, Bucket=settings.COS_BUCKET,
Body=await file.read(), Body=await file.read(),
Key=filename, Key=filename,
@ -62,4 +62,20 @@ async def upload_images(
urls.append(url) urls.append(url)
return success_response(data=MultiUploadResponse(urls=urls)) return success_response(data=MultiUploadResponse(urls=urls))
except Exception as e: except Exception as e:
return error_response(code=500, message=f"上传失败: {str(e)}") return error_response(code=500, message=f"上传失败: {str(e)}")
@router.get("/presigned-url")
async def get_presigned_url(
filename: str,
current_user: UserDB = Depends(get_current_user)
):
"""获取预签名上传URL"""
key = f"uploads/{current_user.userid}/{filename}"
try:
url = cos_manager.get_upload_url(key)
return success_response(data={
"url": url,
"key": key
})
except Exception as e:
return error_response(code=500, message=f"获取上传URL失败: {str(e)}")

View File

@ -6,10 +6,64 @@ import logging
# 正常情况日志级别使用INFO需要定位时可以修改为DEBUG此时SDK会打印和服务端的通信信息 # 正常情况日志级别使用INFO需要定位时可以修改为DEBUG此时SDK会打印和服务端的通信信息
logging.basicConfig(level=logging.INFO, stream=sys.stdout) logging.basicConfig(level=logging.INFO, stream=sys.stdout)
cos_config = CosConfig( class COSManager:
Region=settings.COS_REGION, def __init__(self):
SecretId=settings.TENCENT_SECRET_ID, config = CosConfig(
SecretKey=settings.TENCENT_SECRET_KEY Region=settings.COS_REGION,
) SecretId=settings.TENCENT_SECRET_ID,
SecretKey=settings.TENCENT_SECRET_KEY
)
self.client = CosS3Client(config)
def get_upload_url(self, key: str, expires: int = 3600) -> str:
"""
获取预签名上传URL
Args:
key: 对象键
expires: 签名有效期
Returns:
预签名URL
"""
try:
url = self.client.get_presigned_url(
Method='PUT',
Bucket=settings.COS_BUCKET,
Key=key,
Expired=expires
)
return url
except Exception as e:
logging.error(f"获取上传URL失败: {str(e)}")
raise
def get_download_url(self, key: str, expires: int = 3600) -> str:
"""
获取预签名下载URL
Args:
key: 对象键
expires: 签名有效期
Returns:
预签名URL
"""
try:
url = self.client.get_presigned_url(
Method='GET',
Bucket=settings.COS_BUCKET,
Key=key,
Expired=expires
)
return url
except Exception as e:
logging.error(f"获取下载URL失败: {str(e)}")
raise
def put_object(self, **kwargs):
"""上传对象的封装方法"""
return self.client.put_object(**kwargs)
cos_client = CosS3Client(cos_config) # 创建全局 COS 客户端实例
cos_manager = COSManager()

View File

@ -10,6 +10,7 @@ redis==5.0.1
pymysql==1.1.0 pymysql==1.1.0
SQLAlchemy==2.0.27 SQLAlchemy==2.0.27
tencentcloud-sdk-python==3.0.1035 tencentcloud-sdk-python==3.0.1035
cos-python-sdk-v5
bcrypt bcrypt
aiohttp==3.9.1 aiohttp==3.9.1
cryptography==42.0.2 cryptography==42.0.2