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

資訊專欄INFORMATION COLUMN

如何在vue項目中使用jszip對文件進(jìn)行加壓和解壓

BLUE / 1774人閱讀

摘要:以字符串形式輸出文本內(nèi)容使用二進(jìn)制數(shù)組存儲文本內(nèi)容以上的方法都是實(shí)例,可以用方法指定狀態(tài)的回調(diào)函數(shù)。先將圖片轉(zhuǎn)換為格式使用,再將其轉(zhuǎn)換為二進(jìn)制流進(jìn)行加壓。

jszip-in-vue

本文主要介紹jszip在vue中如何使用

本文涉及到Promise對象和async函數(shù)的使用,建議先提前去了解一下

關(guān)于jszip的使用官方文檔已經(jīng)介紹的非常詳細(xì)了,而且也有示例:https://stuk.github.io/jszip/...

我這里主要是結(jié)合項目的需求然后抽離出來的demo,主要是對圖片的加壓和解壓

解壓

使用.loadAsync(data)可以加載zip文件,data必須是二進(jìn)制流,我這里是使用html原生的input上傳文件來獲取文件流,如果需要讀取本地文件可以使用JSZipUtils.getBinaryContent(zipPath, callback)

JSZipUtils.getBinaryContent("path/to/content.zip", function(err, data) {
    if(err) {
        throw err; // or handle err
    }

    JSZip.loadAsync(data).then(function () {
        // ...
    });
});

// or, with promises:

new JSZip.external.Promise(function (resolve, reject) {
    JSZipUtils.getBinaryContent("path/to/content.zip", function(err, data) {
        if (err) {
            reject(err);
        } else {
            resolve(data);
        }
    });
}).then(function (data) {
    return JSZip.loadAsync(data);
})
.then(...)

使用.file(name).async()讀取文件里面的內(nèi)容。

zip.file("hello.txt").async("string").then(function (data) {
  // 以字符串形式輸出文本內(nèi)容
});

if (JSZip.support.uint8array) {
  zip.file("hello.txt").async("uint8array").then(function (data) {
    // 使用二進(jìn)制數(shù)組存儲文本內(nèi)容
  });
}

以上的方法都是Promise實(shí)例,可以用then方法指定resolved狀態(tài)的回調(diào)函數(shù)。

本示例中通過上傳文件獲取文件并將其解壓將文件內(nèi)容顯示在頁面上

const zipFile = e.target.files[0]
const jszip = new JSZip()
jszip.loadAsync(zipFile).then((zip) => { // 讀取zip
    for (let key in zip.files) { // 判斷是否是目錄
        if (!zip.files[key].dir) {
            if (/.(png|jpg|jpeg|gif)$/.test(zip.files[key].name)) { // 判斷是否是圖片格式
                let base = zip.file(zip.files[key].name).async(
                    "base64") // 將圖片轉(zhuǎn)化為base64格式
                base.then(res => {
                    this.dataList.push({
                        fileName: zip.files[key].name,
                        type: "img",
                        content: `data:image/png;base64,${res}`
                    })
                })
            }
            if (/.(txt)$/.test(zip.files[key].name)) { // 判斷是否是文本文件
                let base = zip.file(zip.files[key].name).async(
                    "string") // 以字符串形式輸出文本內(nèi)容
                base.then(res => {
                    this.dataList.push({
                        fileName: zip.files[key].name,
                        type: "text",
                        content: res
                    })
                })
            }
        }
    }
})
加壓

使用.file(name, content)將內(nèi)容寫進(jìn)文件

zip.file("Hello.txt", "Hello world
");

使用.generateAsync(option)將文件轉(zhuǎn)換為流文件,并使用FileSaver的saveAs(content, fileaname)將文件保存到本地

zip.generateAsync({type:"blob"})
.then(function (blob) {
    saveAs(blob, "hello.zip");
});

本示例主要是對圖片進(jìn)行加壓。先將圖片轉(zhuǎn)換為base64格式(使用canvas),再將其轉(zhuǎn)換為二進(jìn)制流進(jìn)行加壓。因為是使用img.onload異步加載圖片,必須等待圖片加載完后才能將其進(jìn)行加壓,所以需要用async函數(shù)將異步轉(zhuǎn)換為同步。

/**
 *
 * @param url 圖片路徑
 * @param ext 圖片格式
 * @param callback 結(jié)果回調(diào)
 */
async getUrlBase64(url, ext) {
    return new Promise((resolve, reject) => {
        var canvas = document.createElement("canvas") // 創(chuàng)建canvas DOM元素
        var ctx = canvas.getContext("2d")
        var img = new Image()
        img.crossOrigin = "Anonymous" // 處理跨域
        img.src = url
        img.onload = () => {
            canvas.width = img.width // 指定畫板的高度,自定義
            canvas.height = img.height // 指定畫板的寬度,自定義
            ctx.drawImage(img, 0, 0) // 參數(shù)可自定義
            var dataURL = canvas.toDataURL("image/" + ext)
            resolve(dataURL) // 回調(diào)函數(shù)獲取Base64編碼
            canvas = null
        }
    })
},
async exportZip() {
    const imgList = this.imgList
    const proList = []
    const zip = new JSZip()
    const cache = {}
    await imgList.forEach(item => { // 等待所有圖片轉(zhuǎn)換完成
        const pro = this.getUrlBase64(item, ".jpg").then(base64 => {
            const fileName = item.replace(/(.*/)*([^.]+)/i,"$2")
            zip.file(fileName, base64.substring(base64.indexOf(",") + 1), {
                base64: true
            })
            cache[fileName] = base64
        })
        proList.push(pro)
    })
    Promise.all(proList).then(res => {
        zip.generateAsync({
            type: "blob"
        }).then(content => { // 生成二進(jìn)制流
            saveAs(content, "images.zip") // 利用file-saver保存文件
        })
    })
}

以上讀取和保存文件的方法只使用于在瀏覽器中使用,如果需要在node.js中讀取和保存文件的話可以使用node.js內(nèi)置模塊fs。

以上,如果有錯誤的地方歡迎指正

GitHub地址

https://github.com/1366053981...

參考文檔

https://blog.csdn.net/qq_3285...

https://segmentfault.com/a/11...

博客地址
CSDN

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

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

相關(guān)文章

  • 說一說前端文件壓縮

    摘要:因為異步壓縮的時候我們上傳的文件的數(shù)量不定,所以上面需要使用關(guān)鍵字來修飾壓縮過程。而下面的壓縮過程的實(shí)現(xiàn),最終返回一個對象,當(dāng)壓縮過程已完成后,完整的生成的文件存于其中。 基于JSZip的前端文件壓縮 1. 簡介: 這段時間,項目需要做一個這樣的功能:客戶端在上傳文件的時候(具體文件類型),需要對文件進(jìn)行壓縮再上傳以節(jié)省帶寬和服務(wù)器端資源,完成這個功能,我們選擇了GitHub上的JSZ...

    Ververica 評論0 收藏0
  • JS實(shí)現(xiàn)頁面查看zip文件的內(nèi)容

    摘要:前言業(yè)務(wù)場景附件上傳到服務(wù)器后,在頁面中可直接查看中的文件內(nèi)容,如。實(shí)現(xiàn)原理引入工具庫查看中內(nèi)容查看在中引入,其中在使用中的指向進(jìn)行了重定向。是要查看的文件名后綴。這里使用了定義的來展示。若不足之處,歡迎大家指出,共勉。 1 前言 1.1 業(yè)務(wù)場景 附件zip上傳到服務(wù)器后,在頁面中可直接查看zip中的文件內(nèi)容,如:readme.txt。 2 實(shí)現(xiàn)原理 2.1 引入工具庫 jszip、...

    Arno 評論0 收藏0
  • 關(guān)于前端實(shí)現(xiàn)文件下載功能

    摘要:問題以上兩種方式,當(dāng)在下載格式,或者視頻文件時,瀏覽器會直接播放該文件,而達(dá)不到直接下載的功能,此時,當(dāng)下載音視頻文件時無法使用以上兩種方式。 1、通過window.open()打開新頁面下載文件 window.open(`url`, _self) 使用場景:下載excel文件,后端提供接口,接口返回的是文件流,可以直接使用window.open(),最簡單的方式。 優(yōu)點(diǎn):最簡潔; 弊...

    Arno 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<