2016-05-20 3 views
1

Внутри моего кода приложения для определенного набора API я делаю запрос NodeJS, например следующий, который должен возвращать изображение как тело. Этот же запрос отлично работает на Postman (и я вижу изображение).Запрос на перенаправление изображений на NodeJS

module.exports = { 
    getThumbnail: function (thumbnailUrn, env, token, onsuccess){ 
     request({ 
      url: config.baseURL(env) + config.thumbail(thumbnailUrn), 
      method: "GET", 
      headers: { 
       'Authorization': 'Bearer ' + token, 
      } 
     }, function (error, response, body) { 
      // error check removed for simplicity... 
      onsuccess(body); 
     }); 
    } 
} 

Приведенный выше код запускается под моими собственными проверками безопасности и добавляет заголовок маркера. Он работает нормально (запрос звонков возвращается 200/OK).

Теперь на моем маршрутизаторе приложений я хочу ответить на это как изображение, но вывод не интерпретируется как изображение. Вот что у меня есть:

var dm = require(/*the above code*/); 

// express router 
var express = require('express'); 
var router = express.Router(); 

router.get('/getThumbnail', function (req, res) { 
    var urn = req.query.urn; 
    dm.getThumbnail(urn, req.session.env, req.session.oauthcode, function (thumb) { 
     res.writeHead(200, 
      { 
       'Content-Type': 'image/png' 
      } 
     ); 
     // at this point, the 'thumb' variable is filled 
     // but I believe is not properly encoded... 
     // or maybe the res.end output is missing something... 
     res.end(thumb, 'binary'); 
    }); 
}); 

module.exports = router; 

EDIT: в прокомментированы Nodari Lipartiya, это вид поведения прокси (сервер (реагирует с изображением) -> прокси-сервер (Node.js/пересылает клиенту) -> конец пользователь)

+0

Вы пробовали помощник res.download()? –

+0

, но я не хочу загружать изображение (т. Е. Сохранять на сервере), просто перенаправить (от исходного сервера, через мое приложение, к пользователю). –

+1

Вид поведения прокси (сервер (отвечает изображением) -> прокси (node.js/resends to client) -> конечный пользователь)? –

ответ

0

Если я все понял правильно: Я сделал это
server.js

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


app.get('/img', function(req, res, next) { 
    var stream = fs.createReadStream('img.jpeg'); 
    var filename = "img.jpeg"; 
    filename = encodeURIComponent(filename); 
    res.setHeader('Content-disposition', 'inline; filename="' + filename + '"'); 
    res.setHeader('Content-type', 'image/jpeg'); 
    stream.pipe(res); 
}); 



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

proxy.js

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


app.get('/img', function(req, res, next) { 
    console.log('proxy/img'); 
    request({ 
     url: 'http://localhost:9999/img', 
     method: "GET", 
    }, function (error, response, body) { 
     res.end(body, 'binary'); 
    }); 
}); 



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

req.js

var request = require('request'); 


request({ 
     url: 'http://localhost:9998/img', 
     method: "GET", 
    }, function (error, response, body) { 
     console.log('body', body); 
    }); 

работает для меня. Пожалуйста, дайте мне знать, если вам понадобится помощь.

+0

Вы также можете кодировать/декодировать в/из base64 - я думаю, что отправкой изображений в качестве кодированного сообщения base64 является более подходящим –

2

Я не уверен, что возвращается в thumb, но следующий фрагмент кода, казалось, работал для меня (в обход Экспресс для простоты):

var http = require("http") 
var fs = require("fs") 

var server = http.createServer(listener) 

server.listen(() => { 
    console.log(server.address().port) 
}) 

var binary = fs.readFileSync("path to local image") 

function listener(req, resp) { 
    resp.writeHead(200, 
      { 
       'Content-Type': 'image/png' 
      } 
     ); 
    resp.end(new Buffer(binary), "binary") 
} 

Что произойдет, если вы оберните его в Buffer?

+0

Спасибо, что почти сделал это, просто использовал «Буфер (тело, 'base64') ' по моей просьбе и отлично работал! –

+0

Рад, что у вас это работает. Не забывайте поднимать и принимать ответы, которые помогли вам! – mdickin

+0

уже поддержал, но не принял ответ (не совсем так, так что не путайте других) –

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