整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          HTML5 進(jìn)階系列:文件上傳下載

          HTML5 進(jìn)階系列:文件上傳下載

          HTML5 中提供的文件API在前端中有著豐富的應(yīng)用,上傳、下載、讀取內(nèi)容等在日常的交互中很常見。而且在各個(gè)瀏覽器的兼容也比較好,包括移動(dòng)端,除了 IE 只支持 IE10 以上的版本。想要更好地掌握好操作文件的功能,先要熟悉每個(gè)API。

          FileList 對象和 file 對象

          HTML 中的 input[type="file"] 標(biāo)簽有個(gè) multiple 屬性,允許用戶選擇多個(gè)文件,F(xiàn)ileList對象則就是表示用戶選擇的文件列表。這個(gè)列表中的每一個(gè)文件,就是一個(gè) file 對象。

          file 對象的屬性:

          • name : 文件名,不包含路徑。
          • type : 文件類型。圖片類型的文件都會(huì)以 image/ 開頭,可以由此來限制只允許上傳圖片。
          • size : 文件大小。可以根據(jù)文件大小來進(jìn)行其他操作。
          • lastModified : 文件最后修改的時(shí)間。
          <input type="file" id="files" multiple>
          <script>
           var elem=document.getElementById('files');
           elem.onchange=function (event) {
           var files=event.target.files;
           for (var i=0; i < files.length; i++) {
           // 文件類型為 image 并且文件大小小于 200kb
           if(files[i].type.indexOf('image/') !==-1 && files[i].size < 204800){
           console.log(files[i].name);
           }
           }
           }
          </script>
          

          input 中有個(gè) accept 屬性,可以用來規(guī)定能夠通過文件上傳進(jìn)行提交的文件類型。

          accept="image/*" 可以用來限制只允許上傳圖像格式。但是在 Webkit 瀏覽器下卻出現(xiàn)了響應(yīng)滯慢的問題,要等上好幾秒才彈出文件選擇框。

          解決方法就是將 * 通配符改為指定的 MIME 類型。

          <input type="file" accept="image/gif,image/jpeg,image/jpg,image/png">
          

          Blob 對象

          Blob 對象相當(dāng)于一個(gè)容器,可以用于存放二進(jìn)制數(shù)據(jù)。它有兩個(gè)屬性,size 屬性表示字節(jié)長度,type 屬性表示 MIME 類型。

          如何創(chuàng)建

          Blob 對象可以使用 Blob() 構(gòu)造函數(shù)來創(chuàng)建。

          var blob=new Blob(['hello'], {type:"text/plain"});
          

          Blob 構(gòu)造函數(shù)中的第一個(gè)參數(shù)是一個(gè)數(shù)組,可以存放 ArrayBuffer對象、ArrayBufferView 對象、Blob對象和字符串。

          Blob 對象可以通過 slice() 方法來返回一個(gè)新的 Blob 對象。

          var newblob=blob.slice(0,5, {type:"text/plain"});
          

          slice() 方法使用三個(gè)參數(shù),均為可選。第一個(gè)參數(shù)代表要從Blob對象中的二進(jìn)制數(shù)據(jù)的起始位置開始復(fù)制,第二個(gè)參數(shù)代表復(fù)制的結(jié)束位置,第三個(gè)參數(shù)為 Blob 對象的 MIME 類型。

          canvas.toBlob() 也可以創(chuàng)建 Blob 對象。toBlob() 使用三個(gè)參數(shù),第一個(gè)為回調(diào)函數(shù),第二個(gè)為圖片類型,默認(rèn)為 image/png,第三個(gè)為圖片質(zhì)量,值在0到1之間。

          var canvas=document.getElementById('canvas');
          canvas.toBlob(function(blob){ console.log(blob); }, "image/jpeg", 0.5);
          

          下載文件

          Blod 對象可以通過 window.URL 對象生成一個(gè)網(wǎng)絡(luò)地址,結(jié)合 a 標(biāo)簽的 download 屬性來實(shí)現(xiàn)下載文件功能。

          比如把 canvas 下載為一個(gè)圖片文件。

          var canvas=document.getElementById('canvas');
          canvas.toBlob(function(blob){
           // 使用 createObjectURL 生成地址,格式為 blob:null/fd95b806-db11-4f98-b2ce-5eb16b38ba36
           var url=URL.createObjectURL(blob);
           var a=document.createElement('a');
           a.download='canvas';
           a.href=url;
           // 模擬a標(biāo)簽點(diǎn)擊進(jìn)行下載
           a.click();
           // 下載后告訴瀏覽器不再需要保持這個(gè)文件的引用了
           URL.revokeObjectURL(url);
          });
          

          也可以將字符串保存為一個(gè)文本文件,方法類似。

          FileReader 對象

          FileReader 對象主要用來把文件讀入內(nèi)存,并且讀取文件中的數(shù)據(jù)。通過構(gòu)造函數(shù)創(chuàng)建一個(gè) FileReader 對象

          var reader=new FileReader();
          

          該對象有以下方法:

          • abort:中斷讀取操作。
          • readAsArrayBuffer:讀取文件內(nèi)容到ArrayBuffer對象中。
          • readAsBinaryString:將文件讀取為二進(jìn)制數(shù)據(jù)。
          • readAsDataURL:將文件讀取為data: URL格式的字符串。
          • readAsText:將文件讀取為文本。

          上傳圖片預(yù)覽

          在常見的應(yīng)用就是在客戶端上傳圖片之后通過 readAsDataURL() 來顯示圖片。

          <input type="file" id="files" accept="image/jpeg,image/jpg,image/png">
          <img src="blank.gif" id="preview">
          <script>
           var elem=document.getElementById('files'),
           img=document.getElementById('preview');
           elem.onchange=function () {
           var files=elem.files,
           reader=new FileReader();
           if(files && files[0]){
           reader.onload=function (ev) {
           img.src=ev.target.result;
           }
           reader.readAsDataURL(files[0]);
           }
           }
          </script>
          

          但是在一些手機(jī)上豎著拍照上傳照片時(shí)會(huì)有bug,會(huì)發(fā)現(xiàn)照片倒了,包括三星和iPhone。。。解決方案這里不做講解,有興趣可以查看:移動(dòng)端圖片上傳旋轉(zhuǎn)、壓縮的解決方案

          數(shù)據(jù)備份與恢復(fù)

          FileReader 對象的 readAsText() 可以讀取文件的文本,結(jié)合 Blob 對象下載文件的功能,那就可以實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出文件備份到本地,當(dāng)數(shù)據(jù)要恢復(fù)時(shí),通過 input 把備份文件上傳,使用 readAsText() 讀取文本,恢復(fù)數(shù)據(jù)。

          代碼跟上面功能類似,這里不重復(fù),具體的應(yīng)用可以參考:notepad

          Base64 編碼

          在 HTML5 中新增了 atob 和 btoa 方法來支持 Base64 編碼。它們的命名也很簡單,b to a 和 a to b,即代表著編碼和解碼。

          var a="https://lin-xin.github.io";
          var b=btoa(a);
          var c=atob(b);
          console.log(a); // https://lin-xin.github.io
          console.log(b); // aHR0cHM6Ly9saW4teGluLmdpdGh1Yi5pbw==console.log(c); // https://lin-xin.github.io
          

          btoa 方法對字符串 a 進(jìn)行編碼,不會(huì)改變 a 的值,返回一個(gè)編碼后的值。atob 方法對編碼后的字符串進(jìn)行解碼。

          但是參數(shù)中帶中文,已經(jīng)超出了8位ASCII編碼的字符范圍,瀏覽器就會(huì)報(bào)錯(cuò)。所以需要先對中文進(jìn)行 encodeURIComponent 編碼處理。

          var a="哈嘍 世界";
          var b=btoa(encodeURIComponent(a));
          var c=decodeURIComponent(atob(b));
          console.log(b); // JUU1JTkzJTg4JUU1JTk2JUJEJTIwJUU0JUI4JTk2JUU3JTk1JThD
          console.log(c); // 哈嘍 世界
          

          https://zhuanlan.zhihu.com/p/27677175

          TML5 文件上傳下載的實(shí)例代碼,WEBUPLOADER之大文件分段上傳、斷點(diǎn)續(xù)傳,HTML DOM INPUT FILE 大文件上傳源代碼,B/S大附件上傳,支持?jǐn)帱c(diǎn)續(xù)傳,VUE處理文件流實(shí)現(xiàn)上傳下載,VUE 上傳大型文件插件(VUE上傳視頻插件)

          之前在網(wǎng)上也搜索過相關(guān)的資料,在論壇里面也與網(wǎng)絡(luò)交流過,但是給出的方案都不太令人滿意。一方面論壇里面的網(wǎng)頁都沒有真實(shí)的項(xiàng)目經(jīng)驗(yàn)。幾乎大部分的網(wǎng)頁都是在紙上談兵,很多問題完全是憑想象在回答。也不能夠提供真實(shí)案例,基本上都沒有項(xiàng)目的實(shí)戰(zhàn)經(jīng)驗(yàn)。

          甚至有些學(xué)生也在里面不知道從哪里復(fù)制的一些代碼然后粘貼在上面。

          后端PHP5,PHP6,PHP7,PHP8,ThinkPHP,

          服務(wù)器支持Linux,Windows,macOS,CentOS,中標(biāo)麒麟,銀河麒麟,統(tǒng)信,龍芯,華為鯤鵬,

          數(shù)據(jù)庫支持MySQL,達(dá)夢數(shù)據(jù)庫,人大金倉

          需要提供前端源碼,后端源碼,控件源碼

          需要提供7*24小時(shí)技術(shù)支持,長期技術(shù)支持,長期維護(hù)服務(wù)

          需要提供手機(jī),QQ,微信,企業(yè)微信,電子郵箱等聯(lián)系方式

          需要支持包含IE在內(nèi)的全部瀏覽器

          終端需要支持Windows,macOS,Linux,信創(chuàng)國產(chǎn)化環(huán)境,中標(biāo)麒麟,銀河麒麟,統(tǒng)信UOS,龍芯,華為

          功能需要支持10G,50G,100G大文件上傳和斷點(diǎn)續(xù)傳,刷新續(xù)傳,重啟續(xù)傳

          文件夾包含1W,10W,100W個(gè)文件和層級(jí)結(jié)構(gòu)

          支持超大文件分片,分段,分塊,分割上傳下載,斷點(diǎn)續(xù)傳

          支持文件夾上傳,下載斷點(diǎn)續(xù)傳,支持文件夾層級(jí)結(jié)構(gòu),層級(jí)結(jié)構(gòu)信息保存到數(shù)據(jù)庫,下載的時(shí)候同樣保留層級(jí)結(jié)構(gòu)

          支持加密上傳,下載加密,端到端加密,國密SM4加密算法,數(shù)據(jù)加密傳輸,傳輸過程中要保證數(shù)據(jù)是加密的。1.下載示例

          https://gitee.com/xproer/up6-vue-cli



          將up6組件復(fù)制到項(xiàng)目中

          示例中已經(jīng)包含此目錄



          1.引入up6組件



          2.配置接口地址

          接口地址分別對應(yīng):文件初始化,文件數(shù)據(jù)上傳,文件進(jìn)度,文件上傳完畢,文件刪除,文件夾初始化,文件夾刪除,文件列表

          參考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de



          3.處理事件



          啟動(dòng)測試



          啟動(dòng)成功



          效果



          數(shù)據(jù)庫



          源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra

          源碼報(bào)價(jià)單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl

          OEM版報(bào)價(jià)單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a

          控件源碼下載:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc

          older Responsive Html5 Theme

          zCumbeton – Free Responsive Html5 Theme

          Kataklimt Responsive Html5 Theme

          Zparalexy Responsive Html5 Theme

          zBoomMusic – Free Responsive Html5 Theme

          Response Responsive Html5 Theme

          VividPhoto Responsive HTML5 and CSS3 Template

          Respond Responsive Html5 Theme

          Brownie Responsive Html5 Theme

          Triangle Responsive Html5 Theme

          LiquidGem Responsive Html5 Theme

          Hosting Website – Free Html5 Responsive Template

          Flexapp Responsive Html5 Theme

          Designa Responsive Html5 Theme

          Accentbox Responsive Html5 Theme

          OnePager Responsive Html5 Theme

          Simpler Responsive Html5 Theme

          Free ABC Responsive Templates

          Free Modu Responsive HTML 5 Template

          Sunrise – A free responsive HTML5 theme

          Resond Free responsive HTML5 template


          主站蜘蛛池模板: 乱中年女人伦av一区二区| 成人免费视频一区二区三区| 久久久精品一区二区三区| 国产伦一区二区三区免费| 精品福利视频一区二区三区 | 免费无码一区二区三区蜜桃大| 国精品无码一区二区三区在线| 风流老熟女一区二区三区| 日本精品视频一区二区| 亚洲av综合av一区二区三区| tom影院亚洲国产一区二区| 亚洲av午夜福利精品一区| 国产午夜精品免费一区二区三区| 超清无码一区二区三区| 中文字幕日本精品一区二区三区 | 中文字幕精品一区二区| 精品一区二区三区东京热| 在线精品国产一区二区| 在线视频一区二区三区| 波多野结衣一区视频在线| 亚洲AV无码一区二区三区久久精品| 亚洲制服丝袜一区二区三区 | 久久久久人妻精品一区蜜桃| 色偷偷一区二区无码视频| 亚洲国产成人精品无码一区二区| 久久人做人爽一区二区三区| 黑巨人与欧美精品一区| 免费一区二区三区在线视频| 精品久久久久一区二区三区| 自慰无码一区二区三区| 亚洲一区二区三区高清| 麻豆国产一区二区在线观看| 国产小仙女视频一区二区三区| 国产一区二区三区精品久久呦| 人妻无码一区二区视频| 国产一区二区内射最近更新| 麻豆一区二区在我观看| 在线播放精品一区二区啪视频| 国产精品区AV一区二区| 中文字幕在线一区二区在线 | 亚洲综合无码一区二区|