[原]Nodejs關於gzip/deflate壓縮
0x01.關於
寫http時候,在接收http請求時候,出現亂碼,後來發現是gzip沒有解壓。
關於gzip/deflate壓縮,有放入管道壓縮,和非管道壓縮方法。
0x02.非管道壓縮
程式碼如下:
#! /usr/local/bin/node var http = require('http'), querystring = require('querystring'), zlib = require('zlib'); var args = { //引數以及備用資料 contents : querystring.stringify({ //發包的資訊 name:'homeway.me', }), }; var options = { hostname: 'homeway.me', port: 80, path: '/', method: 'GET', headers: { 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Content-Length': args.contents.length, 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.11 Safari/537.36', 'Accept-Encoding':'gzip, deflate', }, }; var get = function ( options, args, callback ){ var req = http.request(options, function (res) { var chunks =[], data, encoding = res.headers['content-encoding']; // 非gzip/deflate要轉成utf-8格式 if( encoding === 'undefined'){ res.setEncoding('utf-8'); } res.on('data', function (chunk){ chunks.push(chunk); }); res.on('end', function (){ var buffer = Buffer.concat(chunks); if (encoding == 'gzip') { zlib.gunzip(buffer, function (err, decoded) { data = decoded.toString(); callback( err, args, res.headers, data); }); } else if (encoding == 'deflate') { zlib.inflate(buffer, function (err, decoded) { data = decoded.toString(); callback( err, args, res.headers, data); }); } else { data = buffer.toString(); callback( null, args, res.headers, data); } }); }); req.write( args.contents ); req.end(); }; get( options, args, function (err, args, headers, data){ console.log('==>header \n', headers); console.log('==data \n', data); });
0x02.管道壓縮
Node中的I/O是非同步的,因此對磁碟和網路的讀寫需要通過回撥函式來讀取資料。
當記憶體中無法一次裝下需要處理的資料時,或者一邊讀取一邊處理更加高效時,我們就需要用到資料流。
NodeJS中通過各種Stream來提供對資料流的操作。
官網提供了管道方法:
// client request example var zlib = require('zlib'); var http = require('http'); var fs = require('fs'); var request = http.get({ host: 'homeway.me', path: '/', port: 80, headers: { 'accept-encoding': 'gzip,deflate' } }); request.on('response', function(response) { var output = fs.createWriteStream('izs.me_index.html'); switch (response.headers['content-encoding']) { // or, just use zlib.createUnzip() to handle both cases case 'gzip': response.pipe(zlib.createGunzip()).pipe(output); break; case 'deflate': response.pipe(zlib.createInflate()).pipe(output); break; default: response.pipe(output); break; } });
引用來源:
by 小草
2015-03-03 14:17:20
相關推薦
[原]Nodejs關於gzip/deflate壓縮
0x01.關於 寫http時候,在接收http請求時候,出現亂碼,後來發現是gzip沒有解壓。 關於gzip/deflate壓縮,有放入管道壓縮,和非管道壓縮方法。 0x02.非管道壓縮 程式碼如下: #! /usr/loc
ASP.NET Web API中使用GZIP 或 Deflate壓縮
== too light class using GZip壓縮 public remove log 對於減少響應包的大小和響應速度,壓縮是一種簡單而有效的方式。 那麽如何實現對ASP.NET Web API 進行壓縮呢,我將使用非常流行的庫用於壓縮/解壓縮稱為DotNetZ
Apache調優之開啟deflate壓縮模塊
Apache 壓縮 模塊 調優 啟用Apache的deflate模塊,可以開啟壓縮功能,減小網站傳輸時的帶寬。apache需要編譯安裝方式,以/usr/local/apache為apache的安裝目錄,以源碼包/usr/local/src/httpd-2.4.33為例首先查看/usr/loca
使用DEFLATE壓縮演算法壓縮後,Base64編碼的方式傳輸經壓縮編碼的檔案內容
1、先把檔案以流的方式InputStream讀入in.read(s, 0, in.available()); /** * 功能:將批量檔案內容使用DEFLATE壓縮演算法壓縮,Base64編碼生成字串並返回<br> * 適用到的交易:批量代付,批量代收,批量退貨&
Web伺服器處理HTTP壓縮之gzip、deflate壓縮
一、什麼是gzip gzip是一種資料格式,預設且目前僅使用deflate演算法壓縮data部分; Gzip是一種流行的檔案壓縮演算法,現在的應用十分廣泛,尤其是在Linux平臺。當應用Gzip壓縮到一個純文字檔案時,效果是非常明顯的,
CSS圖片剪裁與原比例壓縮或放大
在前端網頁製作的過程中,圖片的處理往往比較頭疼,當然不考慮你有很給力的美工後援的情況下。以下將對一些常見的CSS圖片處理需求情況進行分析: 1、一張圖片要放在固定寬高的內容塊中,並填充滿整個內容塊(看起來整齊劃一) 我們假設要把一張大小為1920*1200的圖
Atitit 文件資料的摘要與壓縮技術總結abstract tech v4 目錄 1. 概念包含了原文字中的重要資訊,其長度不超過或遠少於原文字的一半” 1 2. 1. 摘要的作用 應用場景 1 2
Atitit 文件資料的摘要與壓縮技術總結abstract tech v4 目錄 1. 概念包含了原文字中的重要資訊,其長度不超過或遠少於原文字的一半” 1 2. 1. 摘要的作用 應用場景 1 2.1. 如自動報告生成、新聞標題生成、搜尋結果預覽等。此外
atitit 解決教學記憶問題 壓縮演算法原理 哈夫曼 LZ77 gzip zlib deflate演算法.docx 目錄 1. 壓縮理論 1 1.1. 柯氏複雜性 1 2. 1 RLE 1
atitit 解決教學記憶問題 壓縮演算法原理 哈夫曼 LZ77 gzip zlib deflate演算法.docx 目錄 1. 壓縮理論 1 1.1. 柯氏複雜性
gzip,zip壓縮格式和png影象格式的本質壓縮演算法----DEFLATE及其實現:zlib
"Deflate" redirects here. For other uses, see Deflation (disambiguation). In computing, DEFLATE is a lossless data compression algorithm and associated
網頁資料壓縮(python deflate gzip),解壓縮
在寫爬蟲抓取網頁時,通過下面程式碼可以將網頁程式碼抓取回來,一般直接就是HTML的相關網頁程式碼。data = urllib2.urlopen(url).read()但有時,返回的是一些看不懂的資料。這是通過Fiddler抓取回來的資料,其實在上面這個截圖中就可以看到,這個資
網路爬蟲--網頁資料壓縮(python deflate gzip)
轉自:http://www.jianshu.com/p/2c2781462902 做專案就伴隨著一個問題--資料來源。在網路資料獲取的過程,考慮到資料的動態下載需要爬蟲。這也是必經之路吧。 我在運用urllib2做相當簡單的爬蟲入門實驗的時候,出現編碼以及壓縮等問題。這一
極限壓縮----壓縮至原視訊的八分之一
本文使用小丸工具箱,關於其基本操作與下載,請參考我之前的博文: https://blog.csdn.net/galilajiao2006/article/details/85992773 引數設定為,關鍵是寬度/高度的設定,注意,我保持了16::9的解析度比率,只是將1280760降低為了3
極限壓縮----壓縮至原視訊的五分之一
網上評論說,相比格式工廠等,小丸工具箱已經是很好的視訊音訊壓縮工具了,所以在此只研究小丸工具箱。 小丸工具箱(2017.237 綠色免費版)的下載地址: http://www.jisuxz.com/down/38034.html#download 下載完畢解壓縮時會用到解壓密碼:www.ji
java上傳並壓縮圖片(等比例壓縮或者原尺寸壓縮)
先看效果: 原圖:1.33M 處理後:27.4kb 關鍵程式碼; package codeGenerate.util; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Imag
linux實戰(五)----壓縮備份檔案並刪除原檔案----例項解析
我們在日常的監控中要考慮到磁碟空間的問題,經常會把日誌檔案壓縮備份並刪除原檔案。 我們在基礎(八)中已經學習了壓縮檔案的命令,我們需要做的是把壓縮命令與指令碼結合起來。 這裡以實戰(四)中寫
GZIP壓縮原理分析(32)——第五章 Deflate演算法詳解(五23) 動態哈夫曼編碼分析(12)構建哈夫曼樹(04)
*構建literal/length樹 部落格http://www.cnblogs.com/esingchan/p/3958962.html中這樣說道:“ZIP之所以是通用壓縮,它實際上是針對位元組作為
GZIP壓縮原理分析(29)——第五章 Deflate演算法詳解(五20) 動態哈夫曼編碼分析(09)構建哈夫曼樹(01)
現在已經完成了對字串“As mentioned above,there are many kinds of wireless systems other than cellular.”進行壓縮的第一步
GZIP壓縮原理分析(19)——第五章 Deflate演算法詳解(五10) 演算法分析(04) 格式說明(03) 靜態哈夫曼編碼
靜態哈夫曼編碼(Compression with fixed Huffman codes),這部分內容只要看格式就好,出現在這裡的碼錶只是為了說明,細節此時可能不懂,但是後面會鋪開來講,不用擔心。
GZIP壓縮原理分析(31)——第五章 Deflate演算法詳解(五22) 動態哈夫曼編碼分析(11)構建哈夫曼樹(03)
*構建distance樹 現在已經知道壓縮會在壓縮結果中儲存葉子節點深度資訊(即碼字長度)從而讓解壓方間接得到碼錶,但是問題來了,構造樹的資訊只包括碼字長度,可解壓方怎麼知道這個碼字長度是哪個原碼的(注意,“原碼”與“原始碼”的差別,前者是指原始資料,後者是指程式碼)?有什
WebUploader 設定原圖上傳,不啟用壓縮
var uploader = WebUploader.create({ // 選完檔案後,是否自動上傳。 auto: true, // swf檔案路徑 swf: 'lib/webuploader/0.1.5/Uploader.swf', // 檔案接收服務端。