上传应用图片文件
适用版本 >=v7.0.2603.20260326
接口说明:该接口用于上传应用图标,供后续创建企业自建应用接口使用。
请求说明
| 请求地址 | 配置域名+/openapi+/v7/developer/app_logos/upload |
|---|---|
| 请求方法 | POST |
| 签名方式 | KSO-1(配置域名+/openapi不参与签名) |
| 权限要求 | 应用同步管理(应用授权) kso.app_sync.readwrite |
请求头(Header)
| Header | 参数类型 | 是否必填 | 说明 |
|---|---|---|---|
| Content-Type | string | 是 | 固定为:multipart/form-data; boundary=<boundary值>,boundary 由调用方自行定义,需与请求体中的分隔符保持一致 |
| X-Kso-Date | string | 是 | RFC1123 格式的日期,例: Wed, 23 Jan 2013 06:43:08 GMT |
| X-Kso-Authorization | string | 是 | KSO-1 签名值,详见《签名方法》 |
| Authorization | string | 是 | 授权凭证,格式为:Bearer {access_token} |
请求体(Body)
请求体格式: multipart/form-data
| 名称 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
| file | file | 是 | 文件二进制流,支持 JPG/PNG/SVG,最大 300KB |
签名说明
文件上传接口与普通 JSON 接口的签名区别:
- Content-Type 使用完整值(含 boundary),如
multipart/form-data; boundary=---7MA4YWxkTrZu0gW - RequestBody 不参与签名,sha256(RequestBody) 部分取空串
- boundary 由调用方自行定义,需保证请求头 Content-Type、签名计算、请求体分隔符三者完全一致
- 请求体需由调用方按照 multipart 格式手动拼装,不要使用 HTTP 库自动生成的 multipart 功能
请求示例
HTTP 示例
json
POST /v7/developer/app_logos/upload HTTP/1.1
Host: openapi.wps.cn
Authorization: Bearer <access_token>
Content-Type: multipart/form-data; boundary=---7MA4YWxkTrZu0gW
X-Kso-Date: Thu, 12 Feb 2026 02:54:22 GMT
X-Kso-Authorization: KSO-1 <accessKey>:<signature>
---7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="logo.jpg"
Content-Type: application/octet-stream
<二进制文件内容>
---7MA4YWxkTrZu0gW--Python 示例
python
import uuid
import hmac
import hashlib
import requests
from datetime import datetime, timezone
access_key = "AK****************"
secret_key = "SK********************************"
token = "<access_token>"
file_path = "/path/to/logo.jpg"
# 自定义 boundary
boundary = uuid.uuid4().hex
content_type = f"multipart/form-data; boundary={boundary}"
kso_date = datetime.now(timezone.utc).strftime("%a, %d %b %Y %H:%M:%S GMT")
method = "POST"
uri = "/v7/developer/app_logos/upload"
# 签名计算(文件上传 Body 不参与签名,sha256 部分取空串)
sign_str = f"KSO-1{method}{uri}{content_type}{kso_date}"
signature = hmac.new(secret_key.encode(), sign_str.encode(), hashlib.sha256).hexdigest()
# 手动拼装 multipart body
with open(file_path, "rb") as f:
file_data = f.read()
body = (
f"--{boundary}\r\n"
f'Content-Disposition: form-data; name="file"; filename="logo.jpg"\r\n'
f"Content-Type: application/octet-stream\r\n\r\n"
).encode() + file_data + f"\r\n--{boundary}--\r\n".encode()
# 发送请求
headers = {
"Content-Type": content_type,
"X-Kso-Date": kso_date,
"X-Kso-Authorization": f"KSO-1 {access_key}:{signature}",
"Authorization": f"Bearer {token}",
}
resp = requests.post(f"https://openapi.wps.cn{uri}",
headers=headers, data=body, verify=False)
print(resp.json())响应体(Response)
| 名称 | 类型 | 说明 |
|---|---|---|
| code | integer | code |
| msg | string | msg |
| data | object | null |
| ∟ key | string | 上传成功后返回的文件 Key |
响应体示例
json
{
"code": 0,
"msg": "ok",
"data": {
"key": "string"
}
}