接口说明
1.文件上传临时凭证
获取临时动态文件上传凭证,用于后续提交文档解析的操作。
⚠️ 注意:文件上传临时凭证有效期10分钟,请及时使用,过期后需要重新生成。
1.1端点信息
| 项目 | 内容 |
|---|---|
| URL | GET /acx/llm/v1/upload/presign |
| Content-Type | application/json |
| 认证 | Authorization: Bearer <API Key> |
1.2请求参数
Header 参数
| 名称 | 类型 | 必填 | 示例值 |
|---|---|---|---|
| Content-Type | string | 是 | application/json |
| Authorization | string | 是 | Bearer <API Key> |
Params 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| file_name | string | 是 | 文件名 |
1.3 请求体示例
shell
curl 'https://api.scnet.cn/api/llm/v1/upload/presign?file_name=xxxxx.pdf' \
--header 'Authorization: <API Key>'1.4 响应参数
| 参数名称 | 参数类型 | 描述 |
|---|---|---|
| code | String | 应答码 |
| msg | String | 应答信息 |
| data | Object | 应答数据体 |
| file_url | String | 文件地址 |
| upload_url | String | 上传文件服务地址 |
| x_amz_date | String | 时间戳 |
| x_amz_signature | String | 上传签名 |
| x_amz_algorithm | String | 加密方式 |
| key | String | 文件key |
| x_amz_credential | String | 签名凭证 |
| policy | String | 上传策略 |
1.5 响应示例
成功响应
json
{
"code": "0",
"msg": "success",
"data": {
"x_amz_date": "20260518T074807Z",
"upload_url": "https://oss.ksai.scnet.cn:58043/ocr",
"x_amz_signature": "1dd3481914fb3cb51f175dfcf13454f642fe8b0445d2d8ba86d4c137eef28029",
"file_url": "https://oss.ksai.scnet.cn:58043/ocr/doc/2046166062322159617/wx.pdf?response-content-disposition=attachment&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260518%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260518T074808Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=44961dc3b8ef72f90636e2ec8d2f1ee62f5b12f915a8c817211f0855a89d4c97",
"x_amz_algorithm": "AWS4-HMAC-SHA256",
"key": "/doc/2046166062322159617/",
"x_amz_credential": "admin/20260518/us-east-1/s3/aws4_request",
"policy": "eyJleHBpcmF0aW9uIjoiMjAyNi0wNS0xOFQwODo0ODowNy45MzFaIiwiY29uZGl0aW9ucyI6W1siZXEiLCIkYnVja2V0Iiwib2NyIl0sWyJzdGFydHMtd2l0aCIsIiRrZXkiLCIvZG9jLzIwNDYxNjYwNjIzMjIxNTk2MTcvd3gucGRmIl0sWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsMCwxMDQ4NTc2MF0sWyJlcSIsIiR4LWFtei1hbGdvcml0aG0iLCJBV1M0LUhNQUMtU0hBMjU2Il0sWyJlcSIsIiR4LWFtei1jcmVkZW50aWFsIiwiYWRtaW4vMjAyNjA1MTgvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJdLFsiZXEiLCIkeC1hbXotZGF0ZSIsIjIwMjYwNTE4VDA3NDgwN1oiXV19"
}
}2.文件上传
根据临时动态文件上传临时凭证,上传文件。
⚠️ 注意:文件上传生成的文件地址,有效期48小时,请及时使用,过期后需要重新上传文件。
2.1端点信息
| 项目 | 内容 |
|---|---|
| URL | POST <文件上传临时凭证接口中返回的upload_url字段值> |
| Content-Type | multipart/form-data |
2.2请求参数
Header 参数
| 名称 | 类型 | 必填 | 示例值 |
|---|---|---|---|
| Content-Type | string | 是 | multipart/form-data |
Form 参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| policy | string | 是 | 文件上传临时凭证接口中返回的policy字段值 |
| x-amz-algorithm | string | 是 | 文件上传临时凭证接口中返回的x_amz_algorithm字段值 |
| x-amz-credential | string | 是 | 文件上传临时凭证接口中返回的x_amz_credential字段值 |
| x-amz-date | string | 是 | 文件上传临时凭证接口中返回的x_amz_date字段值 |
| x-amz-signature | string | 是 | 文件上传临时凭证接口中返回的x_amz_signature字段值 |
| key | string | 是 | 文件上传临时凭证接口中返回的key字段值 |
| file | string | 是 | 用户本地需要上传的文件 |
2.3 请求体示例
shell
curl '<文件上传临时凭证接口中返回的upload_url字段值>' \
--form 'policy=<文件上传临时凭证接口中返回的policy字段值>' \
--form 'x-amz-algorithm=<文件上传临时凭证接口中返回的x_amz_algorithm字段值>' \
--form 'x-amz-credential=<文件上传临时凭证接口中返回的x_amz_credential字段值>' \
--form 'x-amz-date=<文件上传临时凭证接口中返回的x_amz_date字段值>' \
--form 'x-amz-signature=<文件上传临时凭证接口中返回的x_amz_signature字段值>' \
--form 'key=<文件上传临时凭证接口中返回的key字段值 >' \
--form 'file=@<本地文件>'2.4 python完整请求体示例
python
import requests
API_KEY = "<替换为你的真实API>"
LOCAL_FILE_PATH = "<替换为你要上传的本地文件路径>"
UPLOAD_PRESIGN_API_URL = "https://api.scnet.cn/api/llm/v1/upload/presign"
def get_upload_presign(file_name: str):
"""
第一步:获取文件上传临时凭证(有效期5分钟)
:param file_name: 文件名(如 test.pdf)
:return: 凭证字典 data
"""
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
params = {
"file_name": file_name
}
try:
response = requests.get(UPLOAD_PRESIGN_API_URL, headers=headers, params=params, timeout=10)
response.raise_for_status()
result = response.json()
if result.get("code") != "0":
raise Exception(f"获取凭证失败:{result.get('msg')}")
print("✅ 获取上传凭证成功")
return result["data"]
except Exception as e:
print(f"❌ 获取凭证异常:{str(e)}")
raise
def upload_file(presign_data: dict, local_file_path: str):
"""
第二步:使用临时凭证上传文件
:param presign_data: 第一步获取的凭证数据
:param local_file_path: 本地文件路径
:return: 上传结果
"""
# 从凭证中提取字段
upload_url = presign_data["upload_url"]
policy = presign_data["policy"]
x_amz_algorithm = presign_data["x_amz_algorithm"]
x_amz_credential = presign_data["x_amz_credential"]
x_amz_date = presign_data["x_amz_date"]
x_amz_signature = presign_data["x_amz_signature"]
key = presign_data["key"]
# 构造表单数据
form_data = {
"policy": policy,
"x-amz-algorithm": x_amz_algorithm,
"x-amz-credential": x_amz_credential,
"x-amz-date": x_amz_date,
"x-amz-signature": x_amz_signature,
"key": key,
"file": (os.path.basename(local_file_path), open(local_file_path, "rb"))
}
try:
print(f"📤 开始上传文件:{local_file_path}")
response = requests.post(upload_url, files=form_data, timeout=30)
if response.status_code in (200, 204):
print("✅ 文件上传成功")
return {
"file_url": presign_data["file_url"],
"upload_status": "success"
}
else:
raise Exception(f"上传失败,状态码:{response.status_code},返回:{response.text}")
except Exception as e:
print(f"❌ 文件上传异常:{str(e)}")
raise
if __name__ == "__main__":
# 1. 获取文件名
file_name = os.path.basename(LOCAL_FILE_PATH)
# 2. 获取上传凭证
presign = get_upload_presign(file_name)
# 3. 上传文件
upload_result = upload_file(presign, LOCAL_FILE_PATH)
# 4. 输出最终结果
print("\n" + "=" * 50)
print("📄 最终文件信息:")
print(f"文件地址:{upload_result['file_url']}")6.错误码说明
| 错误码(Code) | HTTP状态码 | 错误含义 | 触发场景 | 处理建议 |
|---|---|---|---|---|
| AccessDenied | 403 | 访问被拒绝 | 1. AccessKey/SecretKey错误 2. 权限策略不允许上传 3. 桶策略禁止写入 | 校验凭证、检查IAM/桶权限策略 |
| SignatureDoesNotMatch | 403 | 签名不匹配 | 1. 密钥错误 2. 客户端与服务端时间偏差过大 3. 请求参数被篡改 | 核对密钥、同步时间、排查请求拦截 |
| InvalidObjectName | 400 | 无效对象名 | 文件名称、路径含非法字符或长度超限 | 统一规范文件命名格式 |
| MalformedPOSTRequest | 400 | POST请求格式错误 | 表单、分片上传参数格式异常 | 修正请求参数结构与格式 |
| MaxMessageLengthExceeded | 400 | 请求体过大 | 单次上传文件超出服务端限额 | 拆分文件,采用分片上传 |
| EntityTooLarge | 413 | 实体过大 | 文件大小超出桶或服务配置上限 | 调整文件大小 |
| MissingContentLength | 411 | 缺少Content-Length | 请求未携带文件大小头部信息 | 补充文件长度请求头参数 |
| RequestTimeout | 408 | 请求超时 | 网络波动、文件偏大、服务响应迟缓 | 检查文件是否过大,或联系客服处理 |
| InternalError | 500 | 服务端内部错误 | 磁盘故障、服务宕机、集群异常 | 稍后重试,或联系客服处理 |
| SlowDown | 503 | 请求限流 | 上传并发量过高,服务负载饱和 | 稍后重试,或联系客服处理 |
| ServiceUnavailable | 503 | 服务不可用 | 集群离线、磁盘只读、节点故障 | 稍后重试,或联系客服处理 |