簡體   English   中英

JSZip在koa.js中有流輸入/輸出

[英]JSZip in koa.js with streaming input/output

我正在尋找使用JSZip從各種下游文件創建文件的zip文件。 這是我正在嘗試做的偽代碼:

function* handler () {
    const ids = this.request.body.ids;

    const zip = new JSZip();
    for (let i = 0; i < ids; i++) {
        const r = yield request.get('/some/remote/service/' + ids[i]);
        zip.file(ids[i], r.body);
    }
    this.body = zip.nodeStream():
}  

但據推測,這將要求所有文件的內容一次在內存中,並且在下載所有文件之前不會開始流式傳輸。

我意識到我可以通過以下方式優化下載時間:

const allFiles = yield ids.map((id) => request.get('/some/remote/service/' + id));

for (let i = 0; i < ids.length; i++) zip.file(ids[i], allFiles[i]);

但主要是我希望一種方法一次只能在內存中保存一個文件,並通過zip將結果流回客戶端。 JSZip有可能嗎?

我希望能夠一次只在內存中保存一個文件,並通過zip將結果流回客戶端。 JSZip有可能嗎?

並非沒有缺點。 JSZip不接受( )生成器或函數作為文件的內容。 它期望文件的完整內容,它的承諾或流。 這意味着當實際需要內容時,您不能(在)最后時刻觸發API調用。

當你添加一個流(使用zip.file("filename.txt", myStream) myStream zip.file("filename.txt", myStream) )時,JSZip將暫停它並等待某些東西使用它(例如調用zip.generateNodeStream()或getter)。

所以你可以做的(在當前的v3.1.2中),限制內存使用是將所有資源添加為流並調用zip.generateNodeStream({streamFiles:true}) 主要缺點是您打開了與Web服務的連接,並且在流式傳輸第一個文件時可能會超時(比如上一個文件)(或者更糟糕的是,取決於輸入流如何處理.pause() ) 。

關於streamFiles和問題的評論:zip格式非常適合流式傳輸。 文檔所述streamFiles選項決定zip文件中文件的大小/ crc32寫入的位置:數據之前(但我們需要暫時將文件保存在內存中以計算它們)或數據之后(流所有內容) ,將計算值放在最后)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM