2017-07-21 52 views
5

Chcę spakować niektóre dane do writableStream.node.js kompresowanie ZIP do pamięci

celem jest zrobienie wszystkiego w pamięci i nie tworzenie rzeczywistego pliku zip na dysku.

Do celów testowych tworzę plik ZIP na dysku. Ale kiedy próbuję otworzyć output.zip pojawia się następujący błąd: "archiwum jest w nieznanym formacie lub jest uszkodzone". (WinZip w Windows 7 i podobny błąd na MAC)

Co robię źle?

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

„Co robię źle?” Nie możemy odpowiedzieć na to pytanie, chyba że powiesz nam o wyniku, jaki osiągasz i jaki jest on inny niż oczekiwany wynik. –

+0

Masz rację. Zaktualizowałem moje pytanie. thx –

Odpowiedz

4

Nie czekasz, aż zawartość zostanie zapisana w strumieniu wyjściowym.

Komentarz z outputStreamBuffer.end(); z kodu i zmienić je na następujące ...

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

To nie działa. kiedy otwieram plik ZIP widzę inny plik o nazwie output.zip.cpgz –

+3

Zaktualizowano moją odpowiedź @ YoniMayer. Spróbuj. Pracował dla mnie. –

+1

@Matt 'finish' jest wywoływana po 'końcu', więc to jest ostatnie wydarzenie. Jakiś konkretny powód, dla którego chcesz użyć "końca"? –