最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js實(shí)現(xiàn)兼容IE789的文件上傳進(jìn)度條

 更新時(shí)間:2016年09月02日 11:50:51   投稿:daisy  
這篇文章給大家介紹了如何實(shí)現(xiàn)兼容IE789的文件上傳進(jìn)度條,如果你的工作用過上傳圖片或上傳大文件啥的,一般在IE低版本瀏覽器里,會(huì)切換到用flash解決,可是有些人肯定不會(huì)為了老舊IE的進(jìn)度條而去學(xué)flash,那么下面來一起看看吧。

Nodejs對(duì)文件上傳的處理

在Express4里req.files已經(jīng)是undefined了;現(xiàn)在用的最多的可能就是formidable了,你知道了它有個(gè)progress事件,于是心中大喜,低版本IE的進(jìn)度條有戲了;OK,試一下:

 form 
 .on('error',function(err){ 
  console.log(err);
 }) 
 .on('aborted',function(){ 
  console.log('aborted'); 
 })
 .on('progress',function(bytesReceived, bytesExpected){ 
  var n=parseInt(parseFloat(bytesReceived/bytesExpected).toFixed(2)*100); 
  console.log(n); 
 });

是的,你很高興的看到了,控制臺(tái)按照預(yù)期打印了一串進(jìn)度值;那么,再進(jìn)一步;

 form 
 .on('progress',function(bytesReceived, bytesExpected){ 
  var n=parseInt(parseFloat(bytesReceived/bytesExpected).toFixed(2)*100); 
  res.write('<script>window.parent.call('+n+')</script>'); 
  //無刷新上傳,你們懂的 console.log(n); 
 });

call方法即在頁面上顯示進(jìn)度值;很不幸,你只能看到最后的100%,看不到上傳具體詳細(xì)的進(jìn)度值;再探...

接下來換個(gè)思路,試一下,將進(jìn)度值保存到session里,額外加一個(gè)請(qǐng)求來輪詢這個(gè)進(jìn)度值,哎喲,不錯(cuò)哦!為了保證你請(qǐng)求的進(jìn)度值是你這次上傳的進(jìn)度值而不是其他上傳的進(jìn)度值,需要在上傳的請(qǐng)求里和額外的請(qǐng)求里約定一個(gè)token值;現(xiàn)在又來一個(gè)問題就是怎么在請(qǐng)求的時(shí)候得到這個(gè)token,由于文件上傳的請(qǐng)求體在Request Payload里,所以req.body拿不到帶過去的值,我也不想去解析這堆了,當(dāng)然我也解析不了;放在url里最好,問題在于有時(shí)候得刷新兩次來刷新token,不好!不得已,我還是放在cookie里吧!

 var cookies=function () { 
  var cks=req.headers.cookie.split(';'),obj={}; 
  for(var i=0;i<cks.length;i++){ 
   obj[cks[i].split('=')[0].replace(/\s+/ig,'')]=unescape(cks[i].split('=')[1]); 
  } 
  return obj; 
 }(); 
 var queryToken=cookies.__token__;
 
 form .on('progress',function(bytesReceived, bytesExpected){ 
  var n=parseInt(parseFloat(form.bytesReceived/form.bytesExpected).toFixed(2)*100); 
  if (req.session['file'+queryToken]) {  
   req.session['file'+queryToken].percent=n; 
  }else{ 
   req.session['file'+queryToken]={ 
    token:queryToken, 
    percent:n 
   } 
  }; 
  console.log(n); 
 });

為了IE789,我來輪詢進(jìn)度值了,原諒我,其實(shí)我的心很痛;

 var getData=function(){ 
  $.post('/uploader',{ 
   getfileinfo:1, 
   uploadtoken:utils.cookie.getCookie('__token__') 
  })
  .then(function(data){ 
   console.log(data);
   if (data.mes<0) { 
    getData(); 
   }else{ 
    var pros=data.info; 
    call(pros.percent);
    if (pros.percent!='100') { 
     getData(); 
    }; 
   }; 
  }); 
 } 
 getData();

call方法即在頁面上顯示進(jìn)度值;很不幸,你只能看到最后的100%,看不到上傳具體詳細(xì)的進(jìn)度值;再探...

好吧,我又一次淪陷了;不過還是感覺不對(duì)勁,ajax輪詢沒有問題,問題在于session里要等到上傳完畢才有值,所以只能看到100%,看不到詳細(xì)進(jìn)度值;我是否可以認(rèn)為,在progress里,之前的res.write和這次的req.session被掛起了呢,但是它又保存了每次的執(zhí)行結(jié)果,直到progress完再釋放,所以只能看到100%;沒心情看formidable的源碼,當(dāng)然我也看不咋懂,我就先這么認(rèn)為吧!

既然ajax輪詢沒問題,那么就是保存到session不得勁了;實(shí)在不成,放到global里試試吧,總不會(huì)往全局對(duì)象里塞個(gè)值也會(huì)掛起吧;稍作改動(dòng)放到global里:

 form 
 .on('progress',function(bytesReceived, bytesExpected){ 
  var n=parseInt(parseFloat(form.bytesReceived/form.bytesExpected).toFixed(2)*100);
  if (global['file'+queryToken]) { 
   global['file'+queryToken].percent=n; 
  }else{ 
   global['file'+queryToken]={ 
    token:queryToken, 
    percent:n 
   } 
  }; 
  console.log(n); 
 });

繼續(xù)輪詢。

漂亮,完全就是那么回事!在chrome里看到的和HTML5的進(jìn)度一個(gè)效果,只是在IE789里會(huì)有點(diǎn)卡頓的感覺,不過還是能看到詳細(xì)的進(jìn)度值的;畢竟老瀏覽器身子骨不咋地,你們懂的;還有,每次上傳都往global里塞值,怎么也得適當(dāng)?shù)那謇硪幌掳?,文件上傳完畢,轉(zhuǎn)移到指定目錄后global['file'+queryToken]=null;

然而,輪詢,就是一個(gè)接一個(gè)好多好多的請(qǐng)求,這里也許會(huì)出問題;要不限制一下吧,間隔500ms請(qǐng)求一次進(jìn)度值;恩,IE789進(jìn)度條就這么解決了,說好的丟掉flash;雖然這個(gè)輪詢可以兼容所有瀏覽器,但畢竟要浪費(fèi)那么多請(qǐng)求,還是判斷下,在IE789以外繼續(xù)HTML5吧!

其實(shí)衡量一下,額外加個(gè)flash上傳和額外的請(qǐng)求,哪個(gè)更值呢,原諒我不懂flash,就不多說了,反正我很不喜歡在頁面上加一下額外的文件;

總結(jié)

關(guān)于文件上傳的組件,還有很多的細(xì)節(jié)處理,本想弄一個(gè)JS文件的,后來一想,為了可復(fù)用性更強(qiáng),還是作為一個(gè)獨(dú)立的頁面搞比較好,需要上傳的地方,iframe一下就行了,肯定比弄一個(gè)JS文件要好很多。以上就是這篇文章的全部內(nèi)容,希望能夠?qū)Υ蠹业膶W(xué)習(xí)或者工作帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • socket.io與pm2(cluster)集群搭配的解決方案

    socket.io與pm2(cluster)集群搭配的解決方案

    這篇文章主要給大家介紹了關(guān)于socket.io與pm2(cluster)集群搭配的解決方案,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來看看吧。
    2017-06-06
  • Node.JS獲取GET,POST數(shù)據(jù)之queryString模塊使用方法詳解

    Node.JS獲取GET,POST數(shù)據(jù)之queryString模塊使用方法詳解

    本文將詳細(xì)介紹nodeJS中的queryString模塊使用方法,包括Node.JS獲取GET,POST數(shù)據(jù)的方法,需要的朋友可以參考下
    2020-02-02
  • NestJS實(shí)現(xiàn)接口的多版本管理

    NestJS實(shí)現(xiàn)接口的多版本管理

    在軟件開發(fā)中,隨著應(yīng)用的迭代更新,經(jīng)常需要引入新的接口版本同時(shí)保留舊版本以保證向后兼容,本教程將通過 NestJS 框架演示如何實(shí)現(xiàn)接口的多版本管理,感興趣的小伙伴跟著小編一起來看看吧
    2024-06-06
  • Node.js中Process.nextTick()和Process.setImmediate()的區(qū)別

    Node.js中Process.nextTick()和Process.setImmediate()的區(qū)別

    這篇文章介紹了Node.js中Process.nextTick()和Process.setImmediate()的區(qū)別,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • 詳解nodejs中express搭建權(quán)限管理系統(tǒng)

    詳解nodejs中express搭建權(quán)限管理系統(tǒng)

    本篇文章主要介紹了詳解express搭建權(quán)限管理系統(tǒng),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • node.js中的fs.fchmodSync方法使用說明

    node.js中的fs.fchmodSync方法使用說明

    這篇文章主要介紹了node.js中的fs.fchmodSync方法使用說明,本文介紹了fs.fchmodSync的方法說明、語法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js?全局變量無法掛載問題解決分析

    Node.js?全局變量無法掛載問題解決分析

    這篇文章主要為大家介紹了Node.js?全局變量無法掛載問題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • nodejs?快速入門之事件循環(huán)

    nodejs?快速入門之事件循環(huán)

    這篇文章主要介紹了nodejs?快速入門之事件循環(huán)的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • node故障定位頂級(jí)技巧動(dòng)態(tài)追蹤Dynamic?Trace詳解

    node故障定位頂級(jí)技巧動(dòng)態(tài)追蹤Dynamic?Trace詳解

    這篇文章主要為大家介紹了node故障定位頂級(jí)技巧動(dòng)態(tài)追蹤Dynamic?Trace詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Node.js學(xué)習(xí)教程之Module模塊

    Node.js學(xué)習(xí)教程之Module模塊

    這篇文章主要給大家介紹了關(guān)于Node.js學(xué)習(xí)教程之Module模塊的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Node.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論

临漳县| 肇源县| 永平县| 富锦市| 金川县| 积石山| 开平市| 正镶白旗| 安多县| 宁安市| 天台县| 巴东县| 阳江市| 庐江县| 芦溪县| 凤城市| 清新县| 邯郸市| 类乌齐县| 乌什县| 上林县| 灌南县| 体育| 沅江市| 柯坪县| 紫阳县| 辉南县| 深圳市| 本溪| 天水市| 确山县| 隆子县| 长阳| 临江市| 平邑县| 洛隆县| 英德市| 枝江市| 福建省| 汤原县| 特克斯县|