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 parseInt 函数分析(转)
Mar 21 Javascript
onkeydown事件解决按回车键直接提交数据的需求
Apr 11 Javascript
Jquery Ajax方法传值到action的方法
May 11 Javascript
JavaScript和CSS交互的方法汇总
Dec 02 Javascript
JavaScript原生对象之String对象的属性和方法详解
Mar 13 Javascript
jQuery Validation PlugIn的使用方法详解
Dec 18 Javascript
JavaScript中获取时间的函数集
Aug 16 Javascript
jQuery Validate设置onkeyup验证的实例代码
Dec 09 Javascript
vue实现列表的添加点击
Dec 29 Javascript
jQuery表单设置值的方法
Jun 30 jQuery
Vue仿今日头条实例详解
Feb 06 Javascript
微信小程序实现跑马灯效果
Oct 21 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合并数组array_merge函数运算符加号与的区别
2008/10/31 PHP
php smarty 二级分类代码和模版循环例子
2011/06/16 PHP
比较好用的PHP防注入漏洞过滤函数代码
2012/04/11 PHP
php 多关键字 高亮显示实现代码
2012/04/23 PHP
简单的php文件上传(实例)
2013/10/27 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
node.js中的fs.readlink方法使用说明
2014/12/17 Javascript
jQuery中用dom操作替代正则表达式
2014/12/29 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
js实现仿网易点击弹出提示同时背景变暗效果
2015/08/13 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
关于PyTorch 自动求导机制详解
2019/08/18 Python
HTML5 Canvas中使用用路径描画圆弧
2015/01/01 HTML / CSS
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
SQL Server面试题
2016/10/17 面试题
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
违反学校规定检讨书
2014/01/18 职场文书
家长对孩子的感言
2014/03/10 职场文书
党代会心得体会
2014/09/04 职场文书
停车场管理协议书范本
2014/10/08 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
尝试使用Python爬取城市租房信息
2022/04/12 Python