OrgEleCho/EleCho.GoCqHttpSdk

Uri有长度限制

IOMisaka opened this issue · 5 comments

通过base64串发送语音消息的时候报超长错误
System.UriFormatException: Invalid URI: The Uri string is too long.

原因似乎是Uri有64k的限制
Uri.cs ->The length of the URI formed by combining baseUri and relativeUri exceeds 65519 characters

这里 CqRecordMsg的File属性从string改成了Uri,这个改动是什么原因呢?

嗯, 因为 Uri 标准 中规定 URI 那么大. 之所以将 string 改成 Uri, 是某些用户不知道传文件的时候要使用 "file://文件路径", 所以直接改成了 Uri, 这样, 当 new Uri(文件路径) 的时候, 会自动转为 "file://文件路径".

但是Uri不能为空,File设置了就会去读取文件,所以似乎没法直接发送较长的base64了,按理说应该和发图片是一样的?CqImageMsg(string file,string url)
主要是考虑客户端和Cqhttp服务不在一台机器的情况下,用base64更方便,不然需要额外的文件交换操作

对了,CqImageMsg的文件名有个Typo,CpImageMsg.cs

目前收到语音消息会导致mainPostLoopTask异常退出,似乎是这个Uri导致的,收到语音消息的时候会new一个Uri("hash.amr")
ApplicationFrameHost_20230409195601

ApplicationFrameHost_20230409195626

感觉是cqhttp底层对媒体消息处理有些不一致
本地发图片new CqImageMsg(File="文件名",Url="base64://*")这样是ok的
本地文件如果不存在就会创建新的,但是发语音消息就不行,本地文件不存在就报错,提示转换消息失败的警告然后消息也不会发送
image

我自己这边是改回了原来的string File,可以正常发超长base64,也能发文件应该

我去给 go-cqhttp 提个 issue, 我认为是它的设计问题. 既然 Image 有两个参数, 一个是 File, 一个 Url, 那么就不应该使用 File 来指定 file:/// 格式的路径, 而是应该直接指定文件路径. 它应该用 Url 来接收 file:/// 这样的 uri

现在马上就将 Uri 改为 string