专栏首页web推送技术IM聊天教程:发送图片/视频/语音/表情
原创

IM聊天教程:发送图片/视频/语音/表情

经常有朋友问起,如何在IM即时通讯中实现发送图片、视频、语音和表情?

为此,小编特意写了一个vue版本的Demo,实现了图片视频文件和表情的的发送,参考这个Demo源代码,相信你就可以轻松的用Uniapp和小程序完成类似的功能。

演示Demo

本文的Demo全套的源码已经开源在码云上,供大家clone或者下载:https://gitee.com/goeasy-io/GoEasyDemo-vue-AudioPictureVideo

一、图片/视频/语音发送

对于语音、视频和图片的发送,您如果有注意的话,在使用QQ或者微信的时候,当有朋友发送图片和视频给您时,收到后,需要等一会儿才能显示出来。就是因为在发送的时候,只发送了文件的路径,您收到后,需要加载才能显示出来。因为当前主流的IM包括微信,QQ等对于图片和视频的发送,通常的做法都是:

  1. 上传文件到文件服务器
  2. 推送文件路径
  3. 收到文件路径
  4. 加载文件

并不会通过网络直接传送源文件,因为对于大文件的传输,会影响消息的即时性。

对于文件的上传,您可以选择直接上传到您自己的服务器,也可以选择上传到各种云服务的对象存储服务,比如腾讯云对象存储 COS上。

参考源码:

DemoService.prototype.sendFileMessage = function (type,content) {
    let uploadResult = restapi.uploadFile(content);
    let message = new Message(type, uploadResult.url);
    uploadResult.promise.then(() => {
        this.publish(message);
    },() =>  {
        var error = new Message(MessageType.TEXT, "文件上传失败.");
        this.messages.unshift(error)
    });
    return uploadResult.promise;
};

云服务的对象存储服务具有更好的稳定性和高可用性,上传的速度也有保证,另外也可以和内容分发网络CDN配合,所以我们建议用GoEasy配合对象存储服务服务来实现图片和视频的发送。

在本文的源码里,选择了使用云服务的对象存储服务作为文件上传服务器,您也可以切换为您自己实现的文件上传服务器,或者直接使用腾讯云对象存储服务COS,原理都是一样的。

二、发送表情

表情的发送也是非常简单的,只是对于一些第一次实现表情发送的同学来说,需要一个思路而已。

细心点的朋友,肯定有发现,当我们在QQ上聊天的时候,我们输入一个反斜杠+“cy”, 就像这样:/cy ,QQ就会立即显示为一个呲牙的表情,就像下图一样:

表情

哈哈哈,相信你已经心里已经明白了十之八九了,对吧?

没错,表情在发送的过程中其实就是发一个像“/cy”这样定义好的的字符串,在对方收到后“翻译”成表情而已。

那为什么不直接发图片,而要进行这么复杂的“翻译”呢?

因为字符串比图片更小,发送的速度更快,用户体验更好。一个系统中的用户成千上万,用字符串可以节约大量的带宽,节约系统资源。

原理讲明白了,我们就开始干活儿吧:

第一步、定义表情

定义一个key value的对象,key作为表情标签,value则为每个表情标签对应的图片:

let expressions = {
    "[risus]": './images/risus.png',
    "[kiss]": './images/kiss.png',
    "[cry]": './images/cry.png',
    "[die]": './images/die.png',
    "[anger]": './images/anger.png',
}

然后画一个表情选择的界面:

表情列表

第二步、选择表情

为每个图片的onclick事件中传入这个表情的字符串标签,当用户点击的时候,将表情的标签写入输入框,就成为了一个普通的字符串。在发送的时候,发送的其实就是这个表情的标签,也就是一个字符串。

<div class="goeasy-expression">
            <div :class="[appearanceClass, 'goeasy-appearance']" @click="show = true">{{text}}</div>
            <div class="expression-container" v-show="show">
                <div class="expression-icon-content">
                    <div class="expression-icon__item"
                         v-for="expression in list"
                         :key="expression.id"
                         @click="selectExpression(expression)">
                        <img :src="expressions[expression.tag]">
                    </div>

                </div>
                <div class="close-expression" @click="show = false"></div>
            </div>
        </div>

第三步、收到表情和展示表情

当对方收到一个字符串后,跟第一步定义的key-value列表去匹配,如果能找到对应的表情,就在页面上展示对应的表情图片,如果找不到,就是一个普通的文本信息。

原理讲清楚了后,具体实现是不是很简单了?

参考我们提供的Demo源代码,相信你很快就能掌握实现方法。

Demo源码:https://gitee.com/goeasy-io/GoEasyDemo-vue-AudioPictureVideo

GoEasy系列教程:

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Websocket直播间聊天室教程 - GoEasy快速实现聊天室

    最近两年直播那个火啊,真的是无法形容!经常有朋友问起,我想实现一个直播间聊天或者我想开发一个聊天室, 要如何开始呢?

    GoEasy消息推送
  • 搭建websocket消息推送服务,必须要考虑的几个问题

    近年,不论是正在快速增长的直播,远程教育以及IM聊天场景,还是在常规企业级系统中用到的系统提醒,对websocket的需求越来越大,对websocket的要求也...

    GoEasy消息推送
  • 微信小程序使用GoEasy实现websocket实时通讯

    不需要下载安装,便可以在微信好友、微信群之间快速的转发,用户只需要扫码或者在微信里点击,就可以立即运行,有着近似APP的用户体验,使得微信小程序成为全民热爱的好...

    GoEasy消息推送
  • h5页面在不同iOS设备上的问题总结

    在做文章评论的功能时,会遇到很多兼容性的问题,在不同机型上的表现也很不一致,总结了以下这些问题。

    grain先森
  • 数据分析专家谢士晨做客数据猿,听听这位日本名古屋大学博士都说了些啥?

    8月1日下午,百融金服数据专家谢士晨做客数据猿,针对金融科技相关问题进行了主题分享。 记者 | 白昆 官网 | www.datayuan.cn 微信公众号ID ...

    数据猿
  • 继天元开源后,旷视又亮出“看家本领”:推出Brain++商业版

    今年上半年,华为、旷视、清华等高校和公司陆续开源自研AI框架,迈出了AI大规模落地化的第一步。

    量子位
  • CSS理解之Float

    小胖
  • 滚动的屏保

    图片的移动,也就是图片坐标的变换,我刚开始做的时候是考虑到四个面,判断每个面是否碰到屏幕壁。这样做的坏处是,需要判断多次,也可能是按照固定的路线在走,一成不变。...

    微醺
  • Flink SQL FileSystem Connector 分区提交与自定义小文件合并策略 ​

    之前笔者在介绍 Flink 1.11 Hive Streaming 新特性时提到过,Flink SQL 的 FileSystem Connector 为了与 F...

    Spark学习技巧
  • 电脑EFS文件加密原理及无秘钥情况下解密思路

    EFS加密是windows系统自带的加密方式,一个系统用户对文件加密后,只有以该用户的身份登陆才能读取该文件。EFS加密的文件和文件夹名字颜色是绿色,或者在该文...

    北亚数据恢复中心

扫码关注云+社区

领取腾讯云代金券