详细原理讲解

开源地址

https://cnb.cool/qiqinb/alicdn-imgbed

使用说明

核心原理

Ali ImgBed 的核心流程是:

sequenceDiagram
    participant Browser as 用户浏览器
    participant Server as Ali ImgBed 服务端
    participant Aliyun as 阿里云开发者社区
    participant OSS as 阿里云 OSS

    participant CDN as 阿里云 CDN

    Browser->>Server: 粘贴 Cookie
    Server->>Browser: 校验 c_csrf 和 login_aliyunid_ticket

    Browser->>Server: 上传图片文件
    Server->>Aliyun: 获取图片上传地址
    Aliyun-->>Server: 返回图片上传地址鉴权URL

    Server->>OSS: PUT图片字节和签名请求头
    OSS-->>Server: 上传成功

    Server-->>Browser: 返回imageUrl
    Browser->>CDN: 通过CDN地址预览图片
    CDN-->>OSS: 回源获取文件内容
    OSS->>CDN: 返回文件内容
    CDN-->>Browser: 返回图片数据,成功访问图片!

1. 用户登录并获取 Cookie

本项目不直接模拟用户登录,也不处理账号密码、MFA、验证码或短信验证。

用户需要先在自己的浏览器中登录阿里云开发者社区,然后从浏览器开发者工具的 Network 请求中复制完整的 Cookie 请求头。

Cookie 通常需要包含:

c_csrf=...
login_aliyunid_ticket=...

其中:

  • c_csrf 是请求接口时使用的 CSRF 参数。
  • login_aliyunid_ticket 是阿里云登录票据。
  • 其他 Cookie 也需要尽可能完整保留,因为阿里云接口可能依赖完整登录上下文。

Cookie 被提交到当前运行的 Ali ImgBed 服务端后,只保存在服务进程内存中,不写入项目文件、数据库或日志。服务重启后,需要重新粘贴 Cookie。

2. 请求阿里云上传地址

服务端调用阿里云图片上传接口:

POST https://developer.aliyun.com/developer/api/image/getImageUploadUrl

请求地址需要携带 p_csrf 参数:

p_csrf=<Cookie 中的 c_csrf>

请求示例:

POST https://developer.aliyun.com/developer/api/image/getImageUploadUrl?p_csrf=example_csrf

请求头:

Accept: */*
Content-Type: application/json
Cookie: c_csrf=...; login_aliyunid_ticket=...; ...
Origin: https://developer.aliyun.com
Referer: https://developer.aliyun.com/article/new

这里的 Referer 是接口校验的一部分:

https://developer.aliyun.com/article/new

如果缺少 Cookie、p_csrf 不正确,或者请求没有正确的 Referer,阿里云接口可能返回 401403 或登录失效错误。

请求体:

{
  "imageName": "example.jpg",
  "imageSize": 12345678
}

字段说明:

字段说明
imageName图片文件名
imageSize图片大小,单位为 Byte

支持的图片扩展名包括:

.png
.gif
.pjp
.jff
.jpe
.pjpeg
.jpeg
.jpg

3. 获取临时 OSS 上传地址

阿里云接口成功后,会返回一个临时签名上传地址:

{
  "success": true,
  "code": "200",
  "message": "获取上传地址成功!",
  "requestId": "example-request-id",
  "data": {
    "uploadUrl": "http://ucc-image.oss-cn-beijing.aliyuncs.com/...",
    "imageUrl": "https://ucc.alicdn.com/pic/developer-ecology/example.jpg",
    "header": {
      "x-oss-meta-author": "ucc",
      "content-type": "image/jpg",
      "Content-Length": "402602"
    }
  }
}

其中:

  • uploadUrl 是带签名的临时 OSS 上传地址。
  • imageUrl 是上传完成后最终使用的 CDN 图片地址。
  • header 是 PUT 上传时必须携带的请求头。

uploadUrl 中通常包含:

Expires
OSSAccessKeyId
Signature

这些参数构成一次临时授权。签名地址不应该长期保存,也不应该写入日志或公开分享。

4. PUT 上传图片

拿到 uploadUrl 后,服务端直接向该地址发起 PUT 请求,将图片原始字节上传到阿里云 OSS。

示例:

PUT http://ucc-image.oss-cn-beijing.aliyuncs.com/...
x-oss-meta-author: ucc
content-type: image/jpg
Content-Length: 402602

请求体就是图片的二进制内容:

[图片原始字节]

Node.js 伪代码:

const imageBytes = await fs.readFile(filePath);

const headers = {
  ...signed.header,
  "Content-Length": String(imageBytes.length),
};

const response = await fetch(signed.uploadUrl, {
  method: "PUT",
  headers,
  body: imageBytes,
});

if (!response.ok) {
  throw new Error(`OSS 上传失败:${response.status}`);
}

上传成功后,服务端将 imageUrl 返回给前端。

5. 返回 CDN 图片地址

最终返回给前端的地址类似:

https://ucc.alicdn.com/pic/developer-ecology/example.jpg

前端可以将这个地址用于:

  • 图片预览
  • 复制直链
  • Markdown
  • HTML
  • 新窗口打开

Markdown 示例:

![example](https://ucc.alicdn.com/pic/developer-ecology/example.jpg)

HTML 示例:

<img
  src="https://ucc.alicdn.com/pic/developer-ecology/example.jpg"
  alt="example"
  referrerpolicy="no-referrer"
>

6. Referer 限制

阿里云 CDN 图片地址和上传接口的 Referer 规则不同。

上传接口

调用阿里云获取上传地址时,需要携带固定 Referer:

Referer: https://developer.aliyun.com/article/new

缺少该 Referer 可能导致接口返回 403 Forbidden

CDN 图片嵌入

ucc.alicdn.com 图片嵌入其他网页时,阿里云 CDN 可能会校验 Referer。为了避免浏览器发送当前网站地址,需要设置:

<meta name="referrer" content="no-referrer">

并在图片标签上设置:

<img
  src="https://ucc.alicdn.com/pic/developer-ecology/example.jpg"
  referrerpolicy="no-referrer"
  alt="example"
>

也可以使用响应头:

Referrer-Policy: no-referrer

项目中的图片预览已经使用:

<img referrerpolicy="no-referrer">

并追加缓存参数,避免浏览器缓存之前因为 Referer 导致的失败结果。

最后修改:2026 年 07 月 25 日
如果觉得我的文章对你有用,请随意赞赏!