[英]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.