wildfirechat / im-server

即时通讯(IM)系统
http://docs.wildfirechat.cn
Other
7.89k stars 1.79k forks source link

如何主动给好友发送文件 #528

Closed jackercoco closed 2 years ago

jackercoco commented 2 years ago

有对应的API吗?

imndx commented 2 years ago

发送文件和发送普通消息没有本质的区别,发送消息的api看这儿

消息负载怎么设置,看这儿

jackercoco commented 2 years ago

根据文档,我想发文件的话,常量值MESSAGE_CONTENT_TYPE_FILE = 5,那type就是5,那文件流怎么发出去呢,放在MessagePayload这个类的那个参数中

heavyrain2012 commented 2 years ago

媒体类消息(比如图片/语音/文件/视频,或者其他自定义包含文件的消息)没有办法直接发送,都是需要先上传到对象存储服务,然后再放入到MessagePayload这个对象的remoteUrl属性中,发送payload。

在IM服务和协议栈传输的都是messagepayload对象,在客户端会把messagepayload转会为对应的消息,因此通过server api发送的payload必须跟客户端的消息encode/decode的payload一致。比如图片消息,server api发送payload必须跟客户端图片消息encode的payload抑制(唯一的区别就是客户端有个二进制熟悉,server api对应使用base64编码过的二进制数据)

jackercoco commented 2 years ago

按你说的,用SDK的方式文件发过去了,接收者也收到了,但是没有显示对应的文件图标和大小

heavyrain2012 commented 2 years ago

让客户端查一下吧,看一下server api发送的消息的payload跟客户端生成的payload有什么区别

jackercoco commented 2 years ago

图片 size和name我用SDK怎么传放哪里

imndx commented 2 years ago

通过server api发送消息时,payload的格式要和客户端对应消息encode出来的结果对应上。

针对文件消息,名字和大小分别放到searchableContentcontent字段,下面是web 端文件消息的encode方法

    encode() {
        let payload = super.encode();
        payload.searchableContent = this.name;
        payload.content = this.size + '';
        return payload;
    }