Skip to content

富媒体上传 ​

富媒体(图片/视频/语音/文件)的发送统一封装在 Bngeuit 门面:ByUrl(公网 URL)与 ByFile(本地文件)两种方式,命名对称成对。

与「素材管理」的区别

本页讲的是把媒体作为消息附件发送(msg_type=7)。若目标是让图片出现在 Markdown 正文里,用素材管理接口预上传拿 qqbot-media:// 链接,见 素材管理。

FileType ​

枚举值数值说明
IMAGE1图片(png/jpg,软限制 20MB)
VIDEO2视频(mp4,软限制 30MB)
VOICE3语音(silk,软限制 20MB)
FILE4文件(任意格式,软限制 200MB)

方式一:公网 URL(ByUrl) ​

传入一个公网可访问的 URL,内部自动完成上传 → 发送:

java
import cn.org.bukkit.bngeuit.Bngeuit;

// 群聊
Bngeuit.sendGroupImageByUrl(groupOpenid, "https://example.com/img.png");
Bngeuit.sendGroupVideoByUrl(groupOpenid, "https://example.com/video.mp4");

// 私聊
Bngeuit.sendC2CVoiceByUrl(openid, "https://example.com/voice.silk");
Bngeuit.sendC2CFileByUrl(openid, "https://example.com/file.rar");

方式二:本地文件(ByFile) ​

传入本地 File 对象,内部自动分片上传 → 发送(预上传 → 逐片 PUT → 分片确认 → 合并),无需关心分片细节:

java
import cn.org.bukkit.bngeuit.Bngeuit;

// 群聊
Bngeuit.sendGroupImageByFile(groupOpenid, new File("path/to/img.png"));
Bngeuit.sendGroupVideoByFile(groupOpenid, new File("path/to/video.mp4"));

// 私聊
Bngeuit.sendC2CVoiceByFile(openid, new File("path/to/voice.silk"));
Bngeuit.sendC2CFileByFile(openid, new File("path/to/file.rar"));

便捷助手

Bngeuit.getMediaFile(String fileName) 从启动时扫描 media_files 建立的缓存中取 File(键为相对路径,支持子目录如 sub/a.png),可直接喂给 ByFile 方法:

java
Bngeuit.sendGroupImageByFile(groupOpenid, Bngeuit.getMediaFile("测试图片.jpg"));

该方法只查缓存,不校验文件当前是否存在;启动后新放进 media_files 的文件不会被收录,需要重启框架。

高级:只上传不发送 ​

需要分步控制时,先上传拿到 file_info,再用它发送:

java
import cn.org.bukkit.bngeuit.dto.message.upload.FileType;
import cn.org.bukkit.bngeuit.dto.message.upload.UploadResponse;

var api = Bngeuit.api();

// URL 上传(单次请求)
UploadResponse r = api.uploadGroupFile(groupOpenid, FileType.IMAGE, url, false);

// 本地文件分片上传(自动走完分片全流程)
UploadResponse r2 = api.uploadGroupFileByFile(groupOpenid, FileType.IMAGE, new File("img.png"));

// 用上传结果直接发送,跳过再次上传
api.sendGroupMedia(groupOpenid, r2.fileInfo());

分片上传事件 ​

本地分片上传会触发可取消的发送事件,可在各步骤拦截:

步骤事件
预上传前GroupUploadPrepareEvent / C2CUploadPrepareEvent
每片确认前GroupUploadPartFinishEvent / C2CUploadPartFinishEvent
合并前GroupUploadChunkedEvent / C2CUploadChunkedEvent(携带 File 对象,getFile() / getFileName() / getFilePath())

取消事件则对应 API 调用被跳过并返回 null。