angular实现IM聊天图片发送实例


Posted in Javascript onMay 08, 2017

IM聊天图片发送有两种方式

  1. 截图粘贴到信息框后点击发送
  2. 选择本地图片发送

图片剪切粘贴,使用QQ或者其他平台的截图功能,截图后粘贴 Ctrl+V ,这个过程需要获取粘贴板上的图片数据,并在页面中展示,也就是将图片数据创建一个img元素,就可以显示出来了。

从粘贴面板中获取图片数据

/**
 * 黏贴发送图片
 * @param e
 */
pasteData(e) {
  e.preventDefault();
  let clipboardData = e.clipboardData;
  if (clipboardData) { //如果支持这个
    let items = clipboardData.items; //获取黏贴里的对象
    if (!items) {
      return;
    }
    let item;
    let types = clipboardData.types || [];
    for (let i = 0, len = types.length; i< len; i++) {
      if (types[i] === 'Files') {
        item = items[i];
        break;
      }
    }
    if (item && item.kind === 'file' && item.type.match(/^image\//i)) {
      imgReader(item);
    }
  }
  functionimgReader(obj){
   let $messageBox=$('#message-boxID');
    let file = obj.getAsFile(),
      reader = new FileReader();
    // 读取文件
    reader.readAsDataURL(file);
    reader.onload = function(e){
      let img = new Image();
      img.src = e.target['result'];
      img.className = 'chatImg';

      $messageBox.append(img);
      setTimeout(()=> {
        $messageBox.scrollTop($messageBox[0].scrollHeight);
      }, 0)
    };
  }
}

本地图片选择

<inputid="upImg"name="fileTrans"type="file"(change)="onFileSelect($event)"/>
/**
 * 选择图片
 * @param event
 */
files:any[]=[];
onFileSelect(event) {
  this.files=[];
  let files = event.dataTransfer ? event.dataTransfer.files : event.target.files;
  let file;
  for (let i = 0; i < files.length; i++) {
    file = files[i];
    if (this.isImage(file)) {
      file.objectURL = this.sanitizer.bypassSecurityTrustUrl((window.URL.createObjectURL(files[i])));
      this.files.push(files[i]);
    }
  }
  let fileUrl = file.objectURL.changingThisBreaksApplicationSecurity;
  let img = new Image();
  img.src = fileUrl;
  img.className = 'chatImg';

  $('#message-boxID').append(img);
}

图片上传服务器

前端angular上传图片到服务器,必然是ajax请求的方式,将图片数据转成二进制流传给后端了。

url:string="http://localhost:8080/upload";
progress:number=0;//进度

uploadPic(formData):Promise<any> {
   let xhr = new XMLHttpRequest(),
   
   
   //封装xhr请求
   return new Pormise(resolve,reject){
     xhr.upload.addEventListener('progress', (e: ProgressEvent) => {
     if(e.lengthComputable) {
      this.progress = Math.round((e.loaded * 100) / e.total);
     }
     }, false);

     xhr.onreadystatechange = ()=> {
       if(xhr.readyState == 4) {
         this.progress = 0;
         
         if(xhr.status >= 200 && xhr.status < 300)
           resolve({xhr: xhr, files: this.files});
         else
           reject({xhr: xhr, files: this.files});
       }
     };
     
     xhr.open('POST', this.url, true);
     //jwt后端验证,设置请求头部信息,解决跨域
     xhr.setRequestHeader("Authorization", "Basic " + localStorage.getItem('jwt'));
     
     xhr.send(formData);
   }
 }

将以上方法写到一个 upload-file.servie.ts 中。然后其他地方就可以使用 uploadFileService.uploadPic() 方法调用了。

这里后端代码忽略,后端Java或者nodejs都很简单,接收文件二进制流保存,或者是上传到百度云与阿里云。

信息发送按钮处理

发送信息处理,需要处理好文本信息和图片信息两种。

/**
 * dataURL to blob, ref to https://gist.github.com/fupslot/5015897
 * @param dataURI
 * @returns {Blob}
 */
functiondataURItoBlob(dataURI){
  var byteString = atob(dataURI.split(',')[1]);
  var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
  var ab = new ArrayBuffer(byteString.length);
  var ia = new Uint8Array(ab);
  for (var i = 0; i < byteString.length; i++) {
    ia[i] = byteString.charCodeAt(i);
  }
  return new Blob([ab], {type: mimeString});
}

/**
   * 发送消息
   * @param taskValue
   */
  sendMessage() {
    let dateTime = this.dateFromat.FormatDate(new Date());
    let value = $('#message-boxID').html();
    let isImg = value.includes('<img');
    //如果是图片信息
    if (isImg) {
      let formData = new FormData();
      let dataURL="";
      let src=$(value)[0].src;
      //图片截图粘贴
      if(src.includes('data:images')){
        dataURL=src;
        let blob = dataURItoBlob(dataURL);
        formData.append('file', blob);
      
      //图片本地选择
      }else if(src.includes('blob:http')){
         //files是图片选择时保存的图片文件对象,见onFileSelect方法
        for(let i = 0; i < this.files.length; i++) {
          formData.append('file', this.files[i], this.files[i].name);
        }
      }
      //调用上传图片方法
      this.uploadFileService.uploadPic(formData).then(result=>{
        //上传成功,do something
        console.log(result);
        
      }).catch(err=>{
        console.log('图片上传失败'+err);
      })
    }else{
      //非图片信息,文本发送
      //this.submitMessage(value);
    }

  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 对象模型 执行模型
Oct 15 Javascript
js中判断文本框是否为空的两种方法
Jul 31 Javascript
页面回到顶部的三种实现(锚标记,js)
Oct 01 Javascript
jQuery循环滚动新闻列表示例代码
Jun 17 Javascript
Javascript原型链的原理详解
Jan 05 Javascript
jQuery 实现评论等级好评差评特效
May 06 Javascript
JS Select下拉框(支持输入模糊查询)
Feb 04 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
May 01 jQuery
微信小程序中做用户登录与登录态维护的实现详解
May 17 Javascript
webpack3+React 的配置全解
Aug 21 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
Oct 31 Javascript
深入理解vue中slot与slot-scope的具体使用
Jan 26 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
May 08 #Javascript
canvas简单快速的实现知乎登录页背景效果
May 08 #Javascript
详解JavaScript中return的用法
May 08 #Javascript
如何使用angularJs
May 08 #Javascript
关于foreach循环中遇到的问题小结
May 08 #Javascript
js下载文件并修改文件名
May 08 #Javascript
JS将unicode码转中文方法
May 08 #Javascript
You might like
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
php强制用户转向www域名的方法
2015/06/19 PHP
轻松掌握php设计模式之访问者模式
2016/09/23 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
js判断60秒以及倒计时示例代码
2014/01/24 Javascript
使用jQuery动态加载js脚本文件的方法
2014/04/03 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
js实现非常简单的焦点图切换特效实例
2015/05/07 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
2016/05/10 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
详谈for循环里面的break和continue语句
2017/07/20 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
深入理解Django的自定义过滤器
2017/10/17 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
Python3.9新特性详解
2020/10/10 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
国际政治个人自荐信范文
2013/11/26 职场文书
大学生入党思想汇报
2014/01/14 职场文书
办公室岗位职责
2014/02/12 职场文书
承诺书怎么写
2014/03/26 职场文书
个人纪律作风整改措施思想汇报
2014/10/12 职场文书
2016春节慰问信范文
2015/03/25 职场文书
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
2022/08/05 Servers
详解MySQL的内连接和外连接
2023/05/08 MySQL