微信聊天系統(tǒng)之發(fā)送圖片

發(fā)送圖片分為三種情況

  • 表情包的發(fā)送
  • 本地圖片的發(fā)送
  • 截圖之后ctrl+v發(fā)送
表情包的發(fā)送

因?yàn)楸砬榘敲總€(gè)客戶端都有的,那么只需要獲取好友發(fā)送給用戶的表情包是哪個(gè)疯搅,并取出來顯示即可

//初始化表情列表
function initEmoji() {
  for(var i=69;i>0;i--){
    $('#emojiWrapper').append(
      '<img src="/emoji/'+i+'.gif">'
    )
  }
}

選擇表情之后,獲取該表情的下標(biāo),并在textarea里面顯示為[emoji:下標(biāo)]的形式,在
數(shù)據(jù)庫里面以字符串[emoji:下標(biāo)]的形式儲(chǔ)存

 $("#emojiWrapper img").click(function () {
     src=$(this).attr("src");
     msg=$("#messageInput").val();
    $("#messageInput").val(msg+"[emoji:"+src.slice(7,-4)+"]");
  });

點(diǎn)擊發(fā)送后與之前的發(fā)送消息一樣

function doSend() {
    var msg=$('#messageInput').val();
    $('#messageInput').val('');
    socket.emit('private message',uid,fid,msg);
    displayNewMsg('me', msg);
    return false;
}

把表情顯示出來


function displayNewMsg(user, msg) {

     msg=displayEmoji(msg);

    $("#v"+fid).append('<li class="'+(user === "me" ? "me" : "other")+'">'+
        '<div class="time">'+
        '<span>time</span>'+
        '</div>'+
        '<div class="msg">'+
        '<img src="/images/2.jpg" class="img-rounded">'+
        '<p>'+msg+'</p>'+
        '</div>'+
        '</li>'
    );
    $("#v"+fid).scrollTop($("#v"+fid)[0].scrollHeight);
}

//判斷消息中是不是有表情桐早,有就更改msg
function displayEmoji(msg){
  var reg = /\[emoji:\d+\]/g;
  var match;
  var emojiIndex;
  var result=msg;
  //用正則表達(dá)式來判斷這條消息里面有沒有表情的信息,有的話就替換成<img>的形式,將表情顯示出來
  while(match = reg.exec(msg)){
      emojiIndex=match[0].slice(7,-1);
      result=result.replace(match[0], '<img src="/emoji/'+emojiIndex+'.gif">');
  }
  return result;
}
發(fā)送本地的圖片給好友

使用base64實(shí)現(xiàn)socket.io傳輸圖片和聲音文件
利用FileReader接口提供了讀取文件的方法和包含讀取結(jié)果的事件模型厨剪。
瀏覽器端的代碼使用readAsDataURL()得到base64 encoded string
readAsDataURL:該方法將文件讀取為一段以 data: 開頭的字符串哄酝,這段字符串的實(shí)質(zhì)就是 Data URL,Data URL是一種將小文件直接嵌入文檔的方案祷膳。這里的小文件通常是指圖像與 html 等格式的文件陶衅。
上傳圖片

           <label id="showImage">
                    <input id="image" type="file" name="file" value="file" accept="image/*"/>
                    <i class="fa fa-picture-o"></i>
            </label>

chat.js 觸發(fā)上傳事件后

 $('body').on('change','#image',doSendImage);
//發(fā)送圖片
function doSendImage(){
  var file = this.files[0],
    reader = new FileReader();
  reader.onload = function(e) {
     socket.emit('sendImg',uid,fid, e.target.result);
     displayNewImg('me',e.target.result);
};
  reader.readAsDataURL(file);
}
//圖片的顯示
function displayNewImg(user,img){
  $("#v"+fid).append('<li class="'+(user === "me" ? "me" : "other")+'">'+
    '<div class="time">'+
    '<span>time</span>'+
    '</div>'+
    '<div class="msg">'+
    '<img src="/images/2.jpg" class="img-rounded">'+
    '<img class="ownImg" src="'+img+'"/>'+
    '</div>'+
    '</li>'
  );
  $("#v"+fid).scrollTop($("#v"+fid)[0].scrollHeight);
}

www 服務(wù)器端的代碼與一般的文本信息發(fā)送無異:

 socket.on('sendImg',function (uid,fid,img) {
    var status;

    if(online.indexOf(fid)!==-1){
      status = 1;
      sockets[users[fid]].socket.emit('newImg',fid,img);
    } else{
      // 如果不在線的話,狀態(tài)為0
      status = 0;
    }
    var data={
      userId: uid,
      from: uid,
      to: fid,
      status: status,
      content: img
    }
    //將圖片轉(zhuǎn)換成的編碼作為消息存到數(shù)據(jù)庫中去
    dbHelper.addMsg(data,function (success,doc) {
      console.log("right");
    });
  });
截圖之后ctrl+v發(fā)送

原理和發(fā)送本地圖片一樣钾唬,同樣是轉(zhuǎn)為base64編碼万哪,就是一開始要觸發(fā)paste事件,并獲得paste之后的值
chat.js添加paste事件

 $('body').on('paste','#messageInput',doPaste);
//ctrl+v粘貼之后發(fā)送圖片
function doPaste(e){
    var clipboardData = e.originalEvent.clipboardData;
    if(clipboardData) {
        for(var i = 0; i < clipboardData.items.length; i++) {
          var c = clipboardData.items[i];
          var file = c.getAsFile();
          var reader = new FileReader();
          reader.onload = function(e) {
              socket.emit('sendImg',uid,fid,e.target.result);
              displayNewImg('me',e.target.result);
          }
          reader.readAsDataURL(file);
        }
    }
}

由于初始化歷史消息的時(shí)候抡秆,要區(qū)分base64編碼和文字信息
更改初始化消息事件

//選擇好友聊天時(shí)奕巍,初始化與好友的聊天記錄
function initMsg() {
    $.ajax({
        type: "POST",
        url: "/users/initMsg",
        dataType: "json",
        contentType: "application/json",
        data: JSON.stringify({
            'userId': uid,
            'fid': fid
        }),
        success: function (data) {
            for(var i=0; i<data.length;i++) {
                var fromID=data[i].from;
                var toId=data[i].to;
                if(uid == fromID) {
                    if(fid==toId) {
                        if(data[i].content.indexOf(';base64,')!=-1){
                            displayNewImg('me',data[i].content);
                        }else{
                            displayNewMsg('me', data[i].content);
                        }
                    }
                } else if(fid == fromID) {
                    if(uid ==toId){
                        if(data[i].content.indexOf(';base64,')!=-1){
                            displayNewImg(fid,data[i].content);
                        }else{
                            displayNewMsg(fid, data[i].content);
                        }
                    }
                } else {
                    console.log("the news chat with others");
                }
            }
        }
  });
}

獲取粘貼事件不能直接用e.clipboardData
要用e.originalEvent.clipboardData;
參考網(wǎng)址:http://stackoverflow.com/questions/2787669/get-html-from-clipboard-in-javascript

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市儒士,隨后出現(xiàn)的幾起案子的止,更是在濱河造成了極大的恐慌,老刑警劉巖着撩,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诅福,死亡現(xiàn)場離奇詭異匾委,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)氓润,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門赂乐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咖气,你說我怎么就攤上這事挨措。” “怎么了崩溪?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵浅役,是天一觀的道長。 經(jīng)常有香客問我伶唯,道長觉既,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任乳幸,我火速辦了婚禮瞪讼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘反惕。我一直安慰自己尝艘,他們只是感情好演侯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布姿染。 她就那樣靜靜地躺著,像睡著了一般秒际。 火紅的嫁衣襯著肌膚如雪悬赏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天娄徊,我揣著相機(jī)與錄音闽颇,去河邊找鬼。 笑死寄锐,一個(gè)胖子當(dāng)著我的面吹牛兵多,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播橄仆,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼剩膘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盆顾?” 一聲冷哼從身側(cè)響起怠褐,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎您宪,沒想到半個(gè)月后奈懒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奠涌,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年磷杏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溜畅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡极祸,死狀恐怖达皿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贿肩,我是刑警寧澤峦椰,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站汰规,受9級(jí)特大地震影響汤功,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜溜哮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一滔金、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茂嗓,春花似錦餐茵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蝌矛,卻和暖如春道批,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背入撒。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工隆豹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茅逮。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓璃赡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親献雅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碉考,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評(píng)論 25 707
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,768評(píng)論 0 15
  • 同時(shí)再添加一個(gè)用戶離開的事件,這個(gè)可能通過socket.io自帶的disconnect事件完成惩琉,當(dāng)一個(gè)用戶斷開連接...
    Www劉閱讀 540評(píng)論 1 9
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程豆励,因...
    小菜c閱讀 6,424評(píng)論 0 17
  • 一個(gè)人的學(xué)歷 不光是一紙文憑就肯定了你的人生,而是你為自己的人生付出了努力! 一個(gè)人的經(jīng)歷 不光是你經(jīng)...
    慕之文閱讀 177評(píng)論 0 0