相关文章推荐
活泼的黄花菜  ·  OpenVINO ...·  1 年前    · 
睿智的打火机  ·  离开老家前,为你父母的智能手机/电视设置成E ...·  2 年前    · 
心软的铁板烧  ·  前端计时器方案探索 - 简书·  2 年前    · 
光明磊落的豆腐  ·  Flutter学习LogUtil封装与实现实 ...·  2 年前    · 
道上混的键盘  ·  windows ...·  2 年前    · 
Code  ›  IM聊天教程:发送图片/视频/语音/表情 | 微信开放社区
软件 小程序
https://developers.weixin.qq.com/community/develop/article/doc/000ae4ec9e0a98b8fb5ab695851c13
开心的海豚
2 年前

交流专区
服务市场
微信学堂
文档
小程序
  • 常用主页

    小程序

    小游戏

    企业微信

    微信支付

  • 服务市场
    微信学堂
    文档
登录
评论

置顶 IM聊天教程:发送图片/视频/语音/表情 精选 热门

GoEasy 2020-05-19
4381 浏览
1 评论

IM即时通讯中发送图片/视频/语音/表情是如何实现的?本文将结合演示demo为你解析相关实现原理。

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

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

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

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

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

  • 上传文件到文件服务器
  • 推送文件路径
  • 收到文件路径
  • 并不会通过网络直接传送源文件,因为对于大文件的传输,会影响消息的即时性。

    对于文件的上传,您可以选择直接上传到您自己的服务器,也可以选择上传到各种云服务的对象存储服务,也就是OSS上。

    参考源码:

    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;
    

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

    在本文的源码里,选择了使用阿里云的OSS作为文件上传服务器,您也可以切换为您自己实现的文件上传服务器,或者选择其他云服务的OSS,原理都是一样的。

    二、发送表情

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

    细心点的朋友,肯定有发现,当我们在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系列教程:

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

    websocket IM聊天教程-教你用GoEasy快速实现IM聊天

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

    微信小程序使用GoEasy实现websocket实时通讯

    Uniapp使用GoEasy实现websocket实时通讯

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

    最后一次编辑于 2020-05-21
    点赞 4
    收藏
    分享

    扫描小程序码分享

    复制链接

    删除文章后,文章内容和评论将一并被删除,且不可恢复。

    删除 取消
    评论
    关闭

    请选择投诉理由

    • 广告内容
    • 违法违规
    • 恶意灌水内容
    • 其他

    1 个评论

    • wang li
      wang li
      2020-05-19
     
    推荐文章
    活泼的黄花菜  ·  OpenVINO 2022.3之十:OpenVINO™ 中用于推理优化的自适应参数选择_openvino2023 没有mo-CSDN博客
    1 年前
    睿智的打火机  ·  离开老家前,为你父母的智能手机/电视设置成Easy模式吧 - 知乎
    2 年前
    心软的铁板烧  ·  前端计时器方案探索 - 简书
    2 年前
    光明磊落的豆腐  ·  Flutter学习LogUtil封装与实现实例详解_Android_脚本之家
    2 年前
    道上混的键盘  ·  windows 10的资源管理器不显示映射的网络驱动器怎么办? - softman11 - 博客园
    2 年前
    今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
    删除内容请联系邮箱 2879853325@qq.com
    Code - 代码工具平台
    © 2024 ~ 沪ICP备11025650号