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 flash下fromCharCode和charCodeAt方法使用说明
Jan 12 Javascript
自制基于jQuery的智能提示插件一枚
Feb 18 Javascript
jQuery EasyUI API 中文文档 - NumberBox数字框
Oct 13 Javascript
js计算字符串长度包含的中文是utf8格式
Oct 15 Javascript
jquery $.trim()方法使用介绍
May 21 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
Jun 09 Javascript
判断JS对象是否拥有某属性的方法推荐
May 12 Javascript
js实现表单及时验证功能 用户信息立即验证
Sep 13 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
May 12 Javascript
浅谈Angular7 项目开发总结
Dec 19 Javascript
详解基于electron制作一个node压缩图片的桌面应用
Jan 29 Javascript
Vue使用鼠标在Canvas上绘制矩形
Dec 24 Vue.js
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学习笔记(毕业设计)
2012/02/21 PHP
PHP数据流应用的一个简单实例
2012/09/14 PHP
深入分析php中接口与抽象类的区别
2013/06/08 PHP
PHP中ob_start函数的使用说明
2013/11/11 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
PHP大文件切割上传并带进度条功能示例
2019/07/01 PHP
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
setTimeout学习小结
2017/02/08 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
Python中实现的RC4算法
2015/02/14 Python
利用Python实现图书超期提醒
2016/08/02 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
Python有序查找算法之二分法实例分析
2017/12/11 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
使用Python画出小人发射爱心的代码
2019/11/23 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
中学生爱国演讲稿
2013/12/31 职场文书
保安的辞职报告怎么写
2014/01/20 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
运动员加油词
2015/07/18 职场文书
公司备用金管理制度
2015/08/04 职场文书