2015-04-06 64 views
3

我試圖通過將字符串(由換行符分隔的JSON)逐漸創建爲一個.gz文件。節點Zlib在流式傳輸時創建無效的.gz文件

使用節點0.11和0.12(兩者具有相同的reasult,.gz文件將不會打開)。

我減少了代碼這樣:被創建的文件

var fs = require('fs'); 
var output = fs.createWriteStream('test.gz'); 
var zlib = require('zlib'); 
var compress = zlib.createGzip(); 
var myStream = compress.pipe(output); 

myStream.write('Hello, World!'); 
myStream.end(); 

,但我不能打開它。我究竟做錯了什麼?

+0

想你的示例中,創建test.gz,但不會被壓縮。我建議你首先看看這個例子[https://nodejs.org/api/zlib.html#zlib_class_zlib_gzip],它接受一個輸入文件,壓縮它並創建另一個壓縮文件。 – 2015-04-06 07:09:55

+0

對!我還注意到這個流是未壓縮的。出於某種原因,在前面添加讀取流正在解決它。但我不想走這條路,這裏似乎有問題。 – 2015-04-06 19:18:03

回答

4

好了,所以這裏的修復:

var fs = require('fs'); 
var output = fs.createWriteStream('test.gz'); 
var zlib = require('zlib'); 
var compress = zlib.createGzip(); 
/* The following line will pipe everything written into compress to the file stream */ 
compress.pipe(output); 
/* Since we're piped through the file stream, the following line will do: 
    'Hello World!'->gzip compression->file which is the desired effect */ 
compress.write('Hello, World!'); 
compress.end(); 

而說明: 管道被用來從一個上下文轉發流至另一個,每個上下文根據它自己的規範操縱流(即STDOUT-> gzip compression-> encryption->文件將導致打印到STDOUT的所有內容都通過gzip壓縮,加密並最終寫入文件)。

在你的原始示例中,你正在寫入管道的末端,這意味着寫入文件時不需要任何操作,因此你得到了要求寫入的純ASCII ASCII碼。這裏的困惑是關於myStream是什麼。你認爲它是整個鏈(gzip-> file),但實際上,它只是結束(文件)。

將管道設置爲流對象後,當您寫入原始流時,所有進一步寫入該流的流將自動穿過。

一些參考文獻,我發現有用:
http://codewinds.com/blog/2013-08-20-nodejs-transform-streams.html#what_are_transform_streams_

http://www.sitepoint.com/basics-node-js-streams/

https://nodejs.org/api/process.html

+0

有趣但你如何壓縮和加密流? 'pg_dump_process.stdout \t \t \t \t \t .pipe(新str2buf()) \t \t \t \t \t .pipe(密碼)\t \t \t \t \t \t \t \t \t \t \t //加密數據 \t \t \t \t \t .pipe(stream_to_s3(bucket,database.folder,s3))\t // \t將數據傳輸到S3'?我不知道把gzip對象放在哪裏:) – 2016-12-27 12:16:08