2013-07-15 2 views
0

Я пытаюсь передать изображения с сервера 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

Вы можете использовать http.request для того, чтобы сделать хорошее проксирование и загрузку ресурсов с дублирующими заголовками.
Вот пример экспресс, который будет прослушивать порт 8080, и сделать запрос на определенный сервер с фактически 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, и вернет его заголовки. Вы также можете настроить заголовки, чтобы предотвратить отправку XML с S3 (когда файл не существует).

Вам не нужно устанавливать какие-либо заголовки, поскольку они проксированы из s3.amazon, и он надежно устанавливает правильные заголовки для вас.
Nor access-control-allow-origin, поскольку он вам понадобится только в случае запроса AJAX на ресурс из другого доменного имени. Но в любом случае не стесняйтесь изменять response.headers перед отправкой. Это простой объект (console.log его для тестов).

+0

Как бы обернуть это в app.get, если бы у меня был подкаталог, запрашиваемый как/skin? – lawx

+0

Как и в настройках заголовков, как бы я помещал заголовки, указанные в вопросе в 'writeHead'? – lawx

+0

Я обновил ответ. Пожалуйста, не стесняйтесь играть с ним сами, а не просить код для вас. Приветствия. – moka

Смежные вопросы