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

 更新时间:2020年05月19日 11:56:20   投稿:mrr  
朋友在问如何在IM即时通讯中实现发送图片视频语音和表情呢,今天小编通过本文给大家详细介绍下,感兴趣的朋友一起看看吧

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

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

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

对于语音、视频和图片的发送,您如果有注意的话,在使用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

总结

到此这篇关于IM聊天教程之发送图片/视频/语音/表情的文章就介绍到这了,更多相关IM聊天发送视频内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解文法的定义与分类(编译原理)

    详解文法的定义与分类(编译原理)

    计算机的语言具有严格的语法、语义,易于形式化的特征,这篇文章主要介绍了详解文法的定义与分类(编译原理),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • 永久解决VSCode终端中文乱码问题

    永久解决VSCode终端中文乱码问题

    这篇文章主要介绍了永久解决VSCode终端中文乱码问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 分享10个免费超棒的编程用等宽字体

    分享10个免费超棒的编程用等宽字体

    本文介绍 10 个适合在编程时使用的等宽字体,它们都是免费的,效果很好
    2013-07-07
  • 常用VsCode 快捷键(Window & Mac)GIF演示

    常用VsCode 快捷键(Window & Mac)GIF演示

    本文给大家分享了23个常用VsCode 快捷键(Window & Mac)的GIF动图演示,非常的实用,有需要的小伙伴可以拿走参考
    2020-02-02
  • 算法系列15天速成 第十天 栈

    算法系列15天速成 第十天 栈

    今天跟大家聊聊栈,在程序设计中,栈的使用还是非常广泛的,比如有“括号匹配问题“,”html结构匹配问题“。所以说掌握了”栈“的使用,对我们学习算法还是很有帮助的
    2013-11-11
  • git stash的正确用法详解

    git stash的正确用法详解

    这篇文章主要为大家介绍了git stash的正确用法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 如何使用 Merklized 抽象语法树压缩智能合约

    如何使用 Merklized 抽象语法树压缩智能合约

    Merklized 抽象语法树 MAST(又名 Merklized 替代脚本树)是一种使用 Merkle 树压缩比特币智能合约的技术,这篇文章主要介绍了使用 Merklized 抽象语法树压缩智能合约,需要的朋友可以参考下
    2023-12-12
  • Git 教程之工作区、暂存区和版本库详解

    Git 教程之工作区、暂存区和版本库详解

    本文主要介绍Git 工作区、暂存区和版本库的知识,这里整理了详细的资料,有需要的小伙伴可以参考下
    2016-09-09
  • 自定义 Github Action 库实战详解

    自定义 Github Action 库实战详解

    这篇文章主要为大家介绍了自定义 Github Action 库实战详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 代码中到底应不应当写注释?

    代码中到底应不应当写注释?

    注释的确有其用途,但大部分情况下,程序员在滥用注释。我是反对夹杂在代码间的注释的,我认为注释应当从代码中独立出来——通常被称为文档。
    2014-10-10

最新评论