管道外部图像时使用自定义标题

时间:2013-07-15 13:24:46

标签: javascript node.js express

我正在尝试通过我的节点服务器从Amazon S3服务器管道图像,同时为响应添加自定义标头。

但是,现在,服务器将使用简单的“文档”进行响应,该文档将下载到我的计算机而未声明文件扩展名。 “文档”仍然包含所需的图像数据,但是如何清楚地表明这是一个可以在我的浏览器中查看的PNG?

这是我目前的代码:

app.get('/skin', function (req, res) {
    res.writeHead(200, {'Content-Type': 'image/png', 'access-control-allow-origin': '*'});
    http.get("http://s3.amazonaws.com/MinecraftSkins/clone1018.png").pipe(res);
});

1 个答案:

答案 0 :(得分:1)

您可能希望使用http.request以便使用重复的标头进行良好的代理和资源加载 以下是express中将侦听端口8080的示例,并将使用您从/ skin / * route请求的实际URL请求特定服务器:

var http    = require('http'),
    express = require('express'),
    app     = express();

app.get('/skin/*', function(req, res, next) {
  var request = http.request({
    hostname: 's3.amazonaws.com',
    port: 80,
    path: '/' + req.params[0],
    method: req.method
  }, function(response) {
    if (response.statusCode == 200) {
      res.writeHead(response.statusCode, response.headers);
      response.pipe(res);
    } else {
      res.writeHead(response.statusCode);
      res.end();
    }
  });
  request.on('error', function(e) {
    console.log('something went wrong');
    console.log(e);
  })
  request.end();
});

app.listen(8080);

要测试它,请在您的计算机上运行,​​然后转到:http://localhost:8080/skin/nyc1940/qn01_GEO.png
它将从Amazon加载代理图像,并返回其标题。您也可以自定义标头,以防止从S3发送XML(当文件不存在时)。

你不需要设置任何标题,因为它们是从s3.amazon代理的,它确实可以为你设置正确的标题。
也不是access-control-allow-origin,因为只有在AJAX请求来自其他域名的资源的情况下才需要它。但无论如何,在发送之前可以随意修改response.headers。它是简单的对象(用于测试的console.log)。