2012-05-15 36 views
3

我想在node.js中加載一個圖像文件。該文件將在內存中,並加載到主循環之外。它只是一個1x1像素。Nodejs,服務於一個恆定的圖像

如何打開圖像文件?

我嘗試以下:

var fs = require('fs'); 
fs.readFile('/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/pixel1x1.gif', function(err,pixel){ 
    if(err) { 
    console.error("Could not open file: %s", err); 
    process.exit(1); 
    } 
    console.log(pixel); 
}); 


Server running at http://127.0.0.1:8124/ 
<Buffer 47 49 46 38 39 61 01 00 01 00 80 00 00 00 00 00 ff ff ff 21 f9 04 01 00 00 00 00 2c 00 00 00 00 01 00 01 00 00 02 01 44 00 3b> 

圖片無法顯示,因爲它包含錯誤。

res.writeHead(200, {'Content-Type': 'image/gif'}); 
res.end(pixel); 
+1

嘗試使用'res.end(pixel,'binary');' –

+1

你能解釋一下你究竟想要達到什麼目的嗎?如果您只需要根據res.writeHead和res.end()函數調用將圖像提供給客戶端,那麼手動配置的方式就會少一些,即配置用於存儲資源並將其提供給客戶端的公共目錄。 –

回答

1

如果它僅僅是一個1x1的gif圖片,那麼你並不需要保存鏡像文件並加載它,因爲已經有裝載了正確的字符串的base64空白的1x1 GIF圖片的好NPM包blankgif代碼,所以它會更快,然後單獨加載圖像。此外,還有一些幫助功能可以幫助您以expressjs發送此圖像。

要使用這個包,你可以只使用此代碼:

var blankgif = require('blankgif'); 
var express = require('express'); 
var app = express(); 

app.get('/track.gif', blankgif.sendBlankGif); 

app.listen(3000, function() { 
    console.log('App listening on port 3000!'); 
}); 

我還以爲你想,因爲你需要這個空白圖像的某個地方跟蹤訪問實現這一點。所以,你可以用這個庫做有兩種方式:

1)使用blankgif的特殊中間件,增加了額外的功能,您的回覆對象

var blankgif = require('blankgif'); 
var express = require('express'); 
var app = express(); 

app.use(blankgif.middleware()); 

app.get('/track.gif', function(req, res) { 
    console.log('request information logged'); 

    res.set('Cache-Control', 'public, max-age=0'); 
    res.status(200).sendBlankGif(); 
}); 

app.listen(3000, function() { 
    console.log('App listening on port 3000!'); 
}); 

2)只要使用自定義的中間件blankgif.sendBlankGif

var blankgif = require('blankgif'); 
var express = require('express'); 
var app = express(); 

app.get('/track.gif', function(req, res, next) { 
    console.log('request information logged'); 
    next(); 
}, blankgif.sendBlankGif); 

app.listen(3000, function() { 
    console.log('App listening on port 3000!'); 
}); 

此外,如果你不想使用這個庫因爲某些原因(或者,如果你想另一個gif圖片),您可以手動擔任這一形象:

var express = require('express'); 
var app = express(); 
var fs = require('fs'); 
var path = require('path'); 

var buff = null; 

fs.readFile(path.resolve(__dirname, 'pixel1x1.gif'), function (err, pixel) { 
    if (err) { 
    console.error("Could not open file: %s", err); 
    process.exit(1); 
    } 

    buff = pixel; 
}); 

app.get('/track.gif', function (req, res) { 
    console.log('request information logged'); 

    res.type('image/gif'); 
    res.send(buff); 
}); 

app.listen(3000, function() { 
    console.log('App listening on port 3000!'); 
});