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 miscellanea -display data real time, using window.status
Jan 09 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
Jun 10 Javascript
JS父页面与子页面相互传值方法
Mar 05 Javascript
node.js中的http.response.addTrailers方法使用说明
Dec 14 Javascript
jQuery匹配文档链接并添加class的方法
Jun 26 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
May 05 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
Jul 01 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
Aug 08 Javascript
JS中的三个循环小结
Jun 20 Javascript
Angular resolve基础用法详解
Oct 03 Javascript
微信小程序实现左滑修改、删除功能
Oct 19 Javascript
150行代码带你实现微信小程序中的数据侦听
May 17 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 date()日期时间函数详解
2010/05/16 PHP
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
JQuery 学习技巧总结
2010/05/21 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
node.js中的fs.writeSync方法使用说明
2014/12/15 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
javascript简单写的判断电话号码实例
2017/05/24 Javascript
微信小程序websocket实现聊天功能
2020/03/30 Javascript
js实现搜索栏效果
2018/11/16 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
实现vuex与组件data之间的数据同步更新方式
2019/11/12 Javascript
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
详解python while 函数及while和for的区别
2018/09/07 Python
pybind11在Windows下的使用教程
2019/07/04 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
python 将视频 通过视频帧转换成时间实例
2020/04/23 Python
python IDLE添加行号显示教程
2020/04/25 Python
如何验证python安装成功
2020/07/06 Python
canvas里面如何基于随机点绘制一个多边形的方法
2018/06/13 HTML / CSS
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
资深生产主管自我评价
2013/09/22 职场文书
计算机数据库专业职业生涯规划书
2014/02/08 职场文书
预备党员公开承诺书
2014/05/28 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
高中政治教师教学反思
2016/02/23 职场文书
SpringBoot中获取profile的方法详解
2022/04/08 Java/Android