自定义 multipart 图床
引擎: multipart/form-data · 预设: 空白 · 自定义 HTTP
如果你的服务不在预设列表里,那它几乎肯定能用这种方式配出来。凡是 PicGo、uPic、ShareX 能对接的图床 API,都落在下面这几个字段里。
Dropline 实际发出的请求
POST /api/upload HTTP/1.1
Host: your-domain.com
Authorization: Bearer <密钥>
Content-Type: multipart/form-data; boundary=DroplineBoundary-…
--DroplineBoundary-…
Content-Disposition: form-data; name="token"
abc123
--DroplineBoundary-…
Content-Disposition: form-data; name="file"; filename="a1f3c9.png"
Content-Type: image/png
<文件字节>
--DroplineBoundary-…--
把它和你的 API 文档对着看,每个字段该填什么就清楚了。
各字段
| 字段 | 对应文档里的什么 |
|---|---|
| 上传地址 | 接口地址。支持模板 —— {{key}} 之类都能用 |
| 方法 | 除非文档写了 PUT 或 PATCH,否则就是 POST |
| 文件字段名 | 文件那个 part 的名字:file、image、source、smfile |
| 自定义请求头 | 鉴权之外文档要求的头,通常是 Accept: application/json |
| 额外表单字段 | 非文件的参数:相册 id、token、有效期、可见性 |
| 鉴权方式 | 见下 |
| JSON path | 链接在响应里的位置 —— 解析响应 |
| 最终链接模板 | 只在响应给的是相对路径时才需要 |
请求头的值和表单字段的值都支持模板,所以 {{key}}、{{base}}、{{date}} 这些在两边都能用。
怎么选鉴权方式
| 文档写的是 | 选 | 怎么填 |
|---|---|---|
Authorization: Bearer TOKEN |
Bearer Token | 密钥 = token,不带前缀 |
Authorization: TOKEN |
自定义请求头 | 头名 Authorization,值 = token |
Authorization: Client-ID xyz |
自定义请求头 | 头名 Authorization,值 = Client-ID xyz |
X-API-Key: TOKEN |
自定义请求头 | 头名 X-API-Key,值 = token |
URL 里带 ?token=TOKEN |
URL 查询参数 | 参数名 token,值 = token |
| 用户名 + 密码 | Basic | 用户名填在名字那一栏,密码作为密钥 |
| token 是一个表单字段 | 无 | 改在额外表单字段里加 |
自定义请求头方式原样发送你填的值、不加任何前缀,这正是它能表达各种奇怪写法的原因。
例子一:token 放在表单字段里
文档写着:
POST https://img.example.com/upload,参数file和api_key,返回{"code":0,"data":{"path":"/i/2026/abc.png"}},文件由https://img.example.com提供。
对应配置:
| 字段 | 值 |
|---|---|
| 上传地址 | https://img.example.com/upload |
| 方法 | POST |
| 文件字段名 | file |
| 额外表单字段 | api_key = YOUR_KEY |
| 鉴权方式 | 无 |
| JSON path | data.path |
| 最终链接模板 | https://img.example.com{{result}} |
注意模板里 {{result}} 前面没有斜杠 —— 返回的路径自带一个。
例子二:目录写在地址里
有的接口把目标目录作为路径的一部分:
| 字段 | 值 |
|---|---|
| 上传地址 | https://img.example.com/upload/{{date}} |
| 对象键模板 | {{uuid}}.{{ext}} |
| JSON path | url |
地址里的模板在构造请求前就渲染好了,于是每天的上传各自落进自己的目录。
先用 curl 验证
如果测试上传失败而报错又看不明白,就在应用外面把这个请求复现一遍。在这里失败的,在 Dropline 里也一样会失败;而原始输出会直接告诉你 JSON path 该怎么写:
curl -sSv -X POST \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json" \
-F "file=@/tmp/test.png" \
-F "album_id=3" \
https://img.example.com/api/upload | jq
然后照着抄:每个 -H 是一个自定义请求头(或者对应某种鉴权方式),每个非文件的 -F 是一个额外表单字段,带 @ 的那个 -F 给出文件字段名。
关于文件名
multipart 里那个 filename 取的是渲染后对象键的最后一段。如果你的 API 会拿它来决定存储名,那么把键模板写成 {{base}}-{{rand}}.{{ext}} 就能控制它。多数图床会忽略它,自己另起名字。