2017-07-21 14 views
5

Tôi muốn nén một số dữ liệu vào luồng có thể ghi.node.js nén ZIP vào bộ nhớ

mục đích là thực hiện tất cả trong bộ nhớ chứ không phải để tạo tệp zip thực trên đĩa.

Chỉ để thử nghiệm, tôi đang tạo tệp ZIP trên đĩa. Nhưng khi tôi cố gắng để mở output.zip tôi nhận được lỗi sau: "lưu trữ là một trong hai định dạng không rõ hoặc bị hư hỏng". (WinZip tại Windows 7 và cũng có lỗi tương tự trên MAC)

Tôi đang làm gì sai?

const fs = require('fs'), 
    archiver = require('archiver'), 
    streamBuffers = require('stream-buffers'); 

let outputStreamBuffer = new streamBuffers.WritableStreamBuffer({ 
    initialSize: (1000 * 1024), // start at 1000 kilobytes. 
    incrementAmount: (1000 * 1024) // grow by 1000 kilobytes each time buffer overflows. 
}); 

let archive = archiver('zip', { 
    zlib: { level: 9 } // Sets the compression level. 
}); 
archive.pipe(outputStreamBuffer); 

archive.append("this is a test", { name: "test.txt"}); 
archive.finalize(); 

outputStreamBuffer.end(); 

fs.writeFile('output.zip', outputStreamBuffer.getContents(), function() { console.log('done!'); }); 
+1

"Tôi đang làm gì sai?" Chúng tôi không thể trả lời câu hỏi đó trừ khi bạn cho chúng tôi biết kết quả bạn đang nhận được và nó khác với kết quả bạn mong đợi như thế nào. –

+0

Bạn nói đúng. Tôi đã cập nhật câu hỏi của mình. thx –

Trả lời

4

Bạn không đợi nội dung được ghi vào luồng đầu ra.

Comment ra outputStreamBuffer.end(); từ mã của bạn và thay đổi nó như sau ...

outputStreamBuffer.on('finish', function() { 
    fs.writeFile('output.zip', outputStreamBuffer.getContents(), function() { 
     console.log('done!'); 
    }); 
}); 
+0

Nó không hoạt động. khi tôi mở tập tin ZIP tôi thấy một tập tin khác gọi là output.zip.cpgz –

+3

Cập nhật câu trả lời của tôi @YoniMayer. Thử nó. Đã làm cho tôi. –

+1

@Matt 'finish' được gọi sau 'end', vì vậy đó là sự kiện cuối cùng của tôi. Bất kỳ lý do cụ thể nào bạn muốn sử dụng 'kết thúc'? –

Các vấn đề liên quan