国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

說一說前端文件壓縮

Ververica / 1851人閱讀

摘要:因?yàn)楫惒綁嚎s的時(shí)候我們上傳的文件的數(shù)量不定,所以上面需要使用關(guān)鍵字來修飾壓縮過程。而下面的壓縮過程的實(shí)現(xiàn),最終返回一個(gè)對(duì)象,當(dāng)壓縮過程已完成后,完整的生成的文件存于其中。

基于JSZip的前端文件壓縮 1. 簡介:

這段時(shí)間,項(xiàng)目需要做一個(gè)這樣的功能:客戶端在上傳文件的時(shí)候(具體文件類型),需要對(duì)文件進(jìn)行壓縮再上傳以節(jié)省帶寬和服務(wù)器端資源,完成這個(gè)功能,我們選擇了GitHub上的JSZip,它是一個(gè)客戶端插件,可以提供客戶端壓縮功能,作者給出了API,但是實(shí)際使用過程中還是有很多問題,下面是實(shí)際過程中遇到的各類問題,直至最終完成整個(gè)文件壓縮再上傳至后臺(tái)。

2.項(xiàng)目相關(guān)組件與環(huán)境:

前端node.js + webpack 作前后臺(tái)分離,后端java

3. 具體實(shí)現(xiàn)

主要js代碼:

var JSZip = require("jszip");
const components = require("components");

$("#confirmBtn").on("click", async function() {
  // 綁定上傳的確認(rèn)按鈕,獲取到obj等模型文件,并壓縮
  let zip = new JSZip();//聲明并創(chuàng)建JSZip對(duì)象
  var fileBox = $("#fileUploadInput"); //從頁面獲取到需要上傳的文件列表,當(dāng)然html是一個(gè)多文件上傳
  var fileList = fileBox[0].files;
  var objName = "example"; // 這里定義一個(gè)壓縮文件的名字,以供后臺(tái)使用,當(dāng)然也可以動(dòng)態(tài)獲取
  //  var flag = false;
  for (const fileObject of fileList) {
    zip = await zipFileAsync(zip, fileObject); //這是設(shè)置異步上傳,await關(guān)鍵字使得后面的zipFileAsync方法執(zhí)行結(jié)束后才將對(duì)象返回給zip變量
  }
  sendFileAsync(zip, objName);
  console.log(zip);
  return false; // 設(shè)置return false防止表單提交
});

這部分代碼就是異步壓縮的核心,以及如何調(diào)用的下面的異步壓縮算法,上面需要Async與await關(guān)鍵字缺一不可,一開始也嘗試過使用同步壓縮的方式,但是會(huì)出現(xiàn)壓縮還沒有全部完成,就已經(jīng)開始提交文件的現(xiàn)象,特別感謝lrh3321的指導(dǎo),才完整的實(shí)現(xiàn)了這個(gè)功能。

因?yàn)楫惒綁嚎s的時(shí)候我們上傳的文件的數(shù)量不定,所以上面需要使用await關(guān)鍵字來修飾壓縮過程。而下面的壓縮過程的實(shí)現(xiàn),最終返回一個(gè)promise對(duì)象,當(dāng)壓縮過程已完成后,完整的生成的文件存于其中。

/**
 * 異步壓縮文件
 * @param zip file
 */
function zipFileAsync(zip, file) {
  const promise = new Promise((resolve) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onloadend = function(e) {
      var result = reader.result;
      //  讀完轉(zhuǎn)一下格式
      result = convertBase64UrlToBlob(result);
      console.log(zip);
      console.log(file.name);
      console.log(file.size);
      // resolve 方法保證異步壓縮完成后才返回promise
      resolve(
        zip.file(file.name, result, {
          type: "blob",
        }));
    };
  });
  return promise;
}

這里的demo請查看JSZip給的例子

/**
 * 異步發(fā)送文件
 * @param zip file
 */
function sendFileAsync(zip, objName) {
  zip.generateAsync({
    type: "blob",
    compression: "DEFLATE", //  force a compression for this file
    compressionOptions: { //  使用壓縮等級(jí),1-9級(jí),1級(jí)壓縮比最低,9級(jí)壓縮比最高
      level: 6,
    },
  }).then(
      function(content) {
        var formData = new FormData();
        formData.append("Blobfile", content); // 獲取上文中壓縮的內(nèi)容,并放入formdata
        formData.append("objName", objName); // 將objName一起放入formdata
        progressBar("Model/UploadModel", formData, content.size); 
      }
  );
  return false;
}
/**
 * 將以base64的圖片url數(shù)據(jù)轉(zhuǎn)換為Blob
 * @param urlData
 * 用url方式表示的base64圖片數(shù)據(jù)
 */
 

http讀取圖片的時(shí)候會(huì)已base64編碼形式對(duì)到服務(wù)器,如果不進(jìn)行重新編碼,則無法在圖片查看器中查看圖片

function convertBase64UrlToBlob(urlData) {
  var bytes = window.atob(urlData.split(",")[1]);
  //  處理異常,將ascii碼小于0的轉(zhuǎn)換為大于0
  var ab = new ArrayBuffer(bytes.length);
  var ia = new Uint8Array(ab);
  for (var i = 0; i < bytes.length; i++) {
    ia[i] = bytes.charCodeAt(i);
  }
  return new Blob([ab], {type: "image/jpg"});
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/85081.html

相關(guān)文章

  • 每日前端進(jìn)階第三題:一說你對(duì)HTML5語義化的理解

    摘要:作者陳大魚頭鏈接背景最近高級(jí)前端工程師劉小夕在上開了個(gè)每個(gè)工作日布一個(gè)前端相關(guān)題的,懷著學(xué)習(xí)的心態(tài)我也參與其中,以下為我的回答,如果有不對(duì)的地方,非常歡迎各位指出。如果你采用正宗川菜做法,最后只需加入花生米,炒拌幾下就可以起鍋了。 作者:陳大魚頭 github: KRISACHAN 鏈接:github.com/YvetteLau/S… 背景:最近高級(jí)前端工程師 劉小夕 在 github 上...

    番茄西紅柿 評(píng)論0 收藏0
  • 每日前端進(jìn)階第三題:一說你對(duì)HTML5語義化的理解

    摘要:作者陳大魚頭鏈接背景最近高級(jí)前端工程師劉小夕在上開了個(gè)每個(gè)工作日布一個(gè)前端相關(guān)題的,懷著學(xué)習(xí)的心態(tài)我也參與其中,以下為我的回答,如果有不對(duì)的地方,非常歡迎各位指出。如果你采用正宗川菜做法,最后只需加入花生米,炒拌幾下就可以起鍋了。 作者:陳大魚頭 github: KRISACHAN 鏈接:github.com/YvetteLau/S… 背景:最近高級(jí)前端工程師 劉小夕 在 github 上...

    Kaede 評(píng)論0 收藏0
  • 一說 HTML 中的 script 標(biāo)簽

    摘要:元素在頁面中使用語言主要的方法就是使用元素,元素內(nèi)部的代碼從上而下依次執(zhí)行。換句話說的代碼可能會(huì)先于中的代碼執(zhí)行,所以在使用屬性時(shí),要避免兩個(gè)相互依賴。 我們在 《Javascript簡史》這遍文章中說過,「Javascript」這門語言是由 Netscape開發(fā)而來,當(dāng)初開發(fā)的時(shí)候?yàn)榱四茏?「Javascript」這門語言能與 HTML 頁面共存,而且不影響頁面的其他內(nèi)容,為此增加了...

    fox_soyoung 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<