文件与图片
文件与图片不是独立控制台模块:上传由客户端/应用服务器调用 POST /api/apps/{appkey}/files(Bearer 用户 JWT,≤20MB),再把返回 URL 放进 content.type=image|file|voice 的消息。控制台没有文件列表、删除或存储配额管理接口。
概念
| 对象 | 真实入口 | 说明 |
|---|---|---|
| 上传 | POST /api/apps/{appkey}/files | Bearer 用户 JWT;≤20MB;SDK uploadFile(data,name,mime) 封装 |
| 图片消息 | content:{type:"image",url,...} | IMKit 渲染缩略图,失败显示占位 |
| 文件消息 | content:{type:"file",url,name,size,mime} | IMKit 渲染文件名/大小/类型 |
| 语音消息 | content:{type:"voice",url,duration} | IMKit 渲染 audio 播放器 |
| 管理端文件治理 | — | 未实现:没有文件清单/删除/配额接口 |
- 上传返回的 URL 由服务端静态路由提供;消息只保存 URL,不内嵌二进制。
- 文件大小上限 20MB 由上传端点约束;超限返回 1007/413 语义。
- 控制台只能通过消息检索查看文件类消息的元数据,不能管理存储。
未实现项
控制台没有“文件/图片”tab,也没有文件删除与容量配额 API;本页不虚构管理端点。需要治理请在对象存储/网关层做。
前置条件
- 服务端已启动(默认
http://127.0.0.1:8080),控制台入口http://127.0.0.1:8080/console/。 - 请求头
X-Admin-Secret与服务端IM_ADMIN_SECRET一致(本地默认dev-admin)。 - 已在控制台选中应用;带
{appkey}的接口都按应用隔离。 - 自托管版无购买、计费、套餐、续费与发票流程(不适用项);本页只覆盖配置、查询与治理接口。
步骤
- 上传前确认身份
上传使用用户 JWT(Bearer),不是 AppSecret;确保用户已连接或持有有效 Token。
- 调用上传
SDK:
const r = await client.uploadFile(file, file.name, file.type);返回data.url。 - 发送消息
把 URL 放进对应 content 类型;文本/图片/文件可复用同一会话。
- 验证渲染
接收端 IMKit 按类型渲染;加载失败时有占位提示。
参数表
| 操作 | 方法与路径 | 参数 |
|---|---|---|
| 上传文件 | POST /api/apps/{appkey}/files | Bearer JWT;multipart 文件;≤20MB |
| 发送图片消息 | RIM.sendImageMessage(...) | {conversationType,targetId,url,...} |
| 发送文件消息 | RIM.sendFileMessage(...) | {url,name,size,mime} |
| 发送语音消息 | RIM.sendVoiceMessage(...) | {url,duration} |
示例
SDK 上传并发送图片
Shell
import { createClient } from '@ni-paas/im-web';
const client = createClient({ appkey: 'demo' });
await client.connect(token);
const file = document.querySelector('#picker').files[0];
const uploaded = await client.uploadFile(file, file.name, file.type);
if (uploaded.code !== 0) throw new Error(uploaded.msg);
await client.sendImageMessage({
conversationType: 1,
targetId: 'bob',
url: uploaded.data.url,
width: 1280,
height: 720,
});直接调用上传端点
Shell
curl -sS -X POST "http://127.0.0.1:8080/api/apps/demo/files" \
-H 'Authorization: Bearer <user-jwt>' \
-F 'file=@./photo.png'常见问题
上传用 AppSecret 还是用户 Token?
用用户 JWT(Bearer);AppSecret 只用于服务端 Open API 签名。
文件存哪里、能删吗?
由服务端本地存储提供;没有删除/清单接口,控制台也不能管理。
超过 20MB 怎么办?
先压缩或分片到对象存储,再把外部 URL 放进消息;上传端点不接受超限文件。
图片加载失败显示什么?
IMKit 显示“[图片加载失败]”占位,不会破坏消息列表。