首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试代理node-js/express中的图像

尝试代理node-js/express中的图像
EN

Stack Overflow用户
提问于 2014-11-18 06:15:04
回答 2查看 9.9K关注 0票数 12

当我尝试通过Express访问它时,我得到了一个断开的图像链接:

代码语言:javascript
复制
app.get('/fileThumbnail', function(req, res) {

var url = proxiedURL +"?" + querystring.stringify(req.query);

logger.info('/fileThumbnail going to url', url);

request.get(url, function(err, response, img) {
    logger.info("response:", response.statusCode, response.headers['content-type']);
    if (!err && response.statusCode === 200) {
        res.writeHead(200, {
            'Content-Type': response.headers['content-type']
        });
        // response.pipe(res);  // not working
        res.writeHead(200, response.headers);
        res.end(img, 'binary');
    } else res.send("Error occurred:", err, "; status code: ", response.statusCode);
})
});

缩略图来自PHP服务器:

代码语言:javascript
复制
if (!$thumbnail) {
    $thumbnail = $_SERVER['DOCUMENT_ROOT'].'/images/spacer.gif';
}


// Write the thumbnail
header('Content-Type: '.image_type_to_mime_type(exif_imagetype($thumbnail)));
header('Content-length: '.filesize($thumbnail));
print file_get_contents($thumbnail,FILE_BINARY);

我尝试过几种方法;响应报头如下:

代码语言:javascript
复制
Access-Control-Allow-Methods:GET,POST,PUT,DELETE,OPTIONS
access-control-allow-origin:*
cache-control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
connection:Keep-Alive
content-length:894
content-type:image/jpeg
date:Mon, 17 Nov 2014 22:13:24 GMT
expires:Thu, 19 Nov 1981 08:52:00 GMT
keep-alive:timeout=5, max=100
pragma:no-cache
server:Apache/2.2.15
X-Powered-By:Express
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-18 06:47:49

像往常一样,简单的解决方案是最好的。只需使用npm install request,然后像这样使用它:

代码语言:javascript
复制
var request = require('request');

app.get('/fileThumbnail', function(req, res) {
    var url = proxiedURL +"?" + querystring.stringify(req.query);
    logger.info('/fileThumbnail going to url', url); 
    request.get(url).pipe(res);
});
票数 29
EN

Stack Overflow用户

发布于 2016-02-17 07:18:47

使用管道()在我的Express版本中不起作用,但是这个实现起作用了。它代理http和https图像urls。

通过以下方式进行呼叫:

代码语言:javascript
复制
http://example.com/image?url=https%3A%2F%2Fwww.google.com%2Fimages%2Fbranding%2Fgooglelogo%2F2x%2Fgooglelogo_color_272x92dp.png

来源:

代码语言:javascript
复制
var url         = require('url');
var http        = require('http');
var https       = require('https');

app.get('/image', function (req, res) {
    var parts = url.parse(req.url, true);
    var imageUrl = parts.query.url;

    parts = url.parse(imageUrl);

    var filename = parts.pathname.split("/").pop();

    var options = {
        port: (parts.protocol === "https:" ? 443 : 80),
        host: parts.hostname,
        method: 'GET',
        path: parts.path,
        accept: '*/*'
    };

    var request = (options.port === 443 ? https.request(options) : http.request(options));

    request.addListener('response', function (proxyResponse) {
        var offset = 0;
        var contentLength = parseInt(proxyResponse.headers["content-length"], 10);
        var body = new Buffer(contentLength);

        proxyResponse.setEncoding('binary');
        proxyResponse.addListener('data', function(chunk) {
            body.write(chunk, offset, "binary");
            offset += chunk.length;
        }); 

        proxyResponse.addListener('end', function() {
            res.contentType(filename);
            res.write(body);
            res.end();            
        });
    });

    request.end();
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26982996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档