文件上传 API 使用说明

本文面向接入 NewAPI 的下游开发者,说明如何申请临时上传地址并将文件直接上传到对象存储。

1. 接口概览

文件上传分为两个请求:
  1. 调用 NewAPI 获取临时上传地址。
  2. 使用临时地址将文件直接 PUT 到对象存储。
文件内容不会经过 NewAPI。NewAPI Key 只用于第一个请求,不能用于对象存储上传请求。 https://your-new-api.example.com 替换为实际 NewAPI 服务地址。

2. 获取上传地址

2.1 请求

2.2 请求参数

filename 只用于保留安全的扩展名,服务端不会直接使用它作为对象路径。对象路径由服务端生成,调用方不能指定或覆盖对象键。

2.3 成功响应

HTTP 状态码为 200
url 是临时敏感信息,不要长期写入日志或公开分享。expires_at 只表示上传 URL 的有效期,不代表文件会在该时间自动删除。

3. 上传文件

获取响应后,使用 methodurlheaders 上传文件。

3.1 curl

其中 UPLOAD_URL 是响应中的 url。如果响应的 headers 包含其他字段,也必须一并发送。

3.2 Node.js

Node.js 18 及以上版本可以使用项目提供的客户端:
PowerShell:
如需指定媒体类型:

3.3 浏览器

浏览器上传时,先由后端或前端服务调用预签名接口,再使用返回的 URL 上传:
浏览器直传还要求 TOS Bucket 配置允许当前前端域名的 PUT CORS 请求,并允许上传时使用的请求头,例如 Content-Type

4. 上传成功后的文件地址

上传成功后,业务侧至少保存 object_keypublic_url 是否能直接访问取决于 TOS 权限:
  • Bucket 或对象允许公共读:可以直接使用 public_url
  • Bucket 为私有:访问 public_url 会返回 403,需要由业务后端另外生成 GET 预签名下载 URL。
不要根据客户端文件名自行拼接对象地址,应该使用接口返回的 object_keypublic_url

5. 错误处理

5.1 NewAPI 响应错误

5.2 TOS 上传响应错误

预签名 URL 过期后不可复用。重试时必须重新调用 /v1/upload/presign

6. 调用频率限制

预签名接口默认按 API Key 对应的令牌 ID进行限流:
  • 每个 API Key 默认每 60 秒最多申请 100 个预签名 URL。
  • 不同 API Key 分别计算,不会因为共用同一个 OpenResty、NAT 或代理 IP 而共享额度。
  • 实际文件从客户端直传 TOS 的 PUT 请求不计入此限制。
  • 只有调用 POST /v1/upload/presign 才会消耗额度。
管理员可以通过环境变量调整:
关闭限流:
修改环境变量后需要重启或重新创建 NewAPI 服务。触发限制时接口返回 429 Too Many Requests,客户端应等待一段时间后重新申请 URL,不要在短时间内无限重试。

7. 安全要求

  • NewAPI Key 只发送给 NewAPI,不要放入 TOS PUT 请求。
  • 不要把 TOS_ACCESS_KEYTOS_SECRET_KEY 放到客户端代码中。
  • 不要修改预签名 URL 的查询参数。
  • 生产环境调用 NewAPI 应使用 HTTPS。
  • 不要把完整的预签名 URL 写入长期日志。
  • 私有文件不要依赖 public_url,应保存 object_key 并通过后端授权下载。

8. 最小接入示例