|
|
import base64
|
|
|
import time
|
|
|
import oss2
|
|
|
from oss2.models import PolicyConditions # 确保正确导入 PolicyConditions
|
|
|
from typing import Dict
|
|
|
|
|
|
class AliUtil:
|
|
|
def __init__(self):
|
|
|
# 从配置中读取阿里云 OSS 的配置
|
|
|
self.endpoint = "your_endpoint" # 替换为你的 OSS endpoint
|
|
|
self.access_key_id = "your_access_key_id" # 替换为你的 AccessKeyId
|
|
|
self.access_key_secret = "your_access_key_secret" # 替换为你的 AccessKeySecret
|
|
|
|
|
|
def get_signature(self, bucket_name: str) -> Dict[str, str]:
|
|
|
"""
|
|
|
获取临时访问 OSS 的签名
|
|
|
:param bucket_name: bucket 名称,由前端传入(上传不同文件到不同文件夹)
|
|
|
:return: 包含签名信息的字典
|
|
|
"""
|
|
|
resp_map = {}
|
|
|
# host 的格式为 bucketName.endpoint
|
|
|
host = f"https://{bucket_name}.{self.endpoint}"
|
|
|
# callbackUrl 为上传回调服务器的 URL,请将下面的 IP 和 Port 配置为您自己的真实信息。
|
|
|
callback_url = ""
|
|
|
dir = "" # 用户上传文件时指定的前缀。
|
|
|
|
|
|
# 初始化 OSS 客户端
|
|
|
auth = oss2.Auth(self.access_key_id, self.access_key_secret)
|
|
|
bucket = oss2.Bucket(auth, self.endpoint, bucket_name)
|
|
|
|
|
|
try:
|
|
|
# 设置过期时间为半小时 (1800 秒)
|
|
|
expire_time = 60 * 30
|
|
|
expire_end_time = int(time.time()) + expire_time
|
|
|
|
|
|
# 设置 Policy 条件
|
|
|
policy_conditions = PolicyConditions()
|
|
|
policy_conditions.add_condition(PolicyConditions.CONTENT_LENGTH_RANGE, 0, 1048576000) # 文件大小限制
|
|
|
policy_conditions.add_condition(PolicyConditions.STARTS_WITH, PolicyConditions.KEY, dir) # 文件前缀
|
|
|
|
|
|
# 生成 Post Policy
|
|
|
post_policy = bucket._make_post_policy(expire_end_time, policy_conditions)
|
|
|
encoded_policy = base64.b64encode(post_policy.encode('utf-8')).decode('utf-8')
|
|
|
|
|
|
# 计算签名
|
|
|
post_signature = bucket._make_post_signature(post_policy)
|
|
|
|
|
|
# 构建返回的签名信息
|
|
|
resp_map["accessid"] = self.access_key_id
|
|
|
resp_map["policy"] = encoded_policy
|
|
|
resp_map["signature"] = post_signature
|
|
|
resp_map["dir"] = dir
|
|
|
resp_map["host"] = host
|
|
|
resp_map["expire"] = str(expire_end_time)
|
|
|
|
|
|
# 构建回调信息
|
|
|
callback_body = {
|
|
|
"callbackUrl": callback_url,
|
|
|
"callbackBody": "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}",
|
|
|
"callbackBodyType": "application/x-www-form-urlencoded"
|
|
|
}
|
|
|
base64_callback_body = base64.b64encode(str(callback_body).encode('utf-8')).decode('utf-8')
|
|
|
resp_map["callback"] = base64_callback_body
|
|
|
|
|
|
except Exception as e:
|
|
|
print(f"Error: {e}")
|
|
|
|
|
|
return resp_map |