【问题标题】:get image from another domain and encode base64 by node js从另一个域获取图像并通过节点 js 编码 base64
【发布时间】:2012-07-02 01:32:09
【问题描述】:

我想从 url 获取图像并通过 nodejs 对该图像进行 base64 编码,然后通过 base64 编码显示该图像,但此代码不正确。 此代码保存不正确的 png 文件。

var http = require('http')
  , fs = require('fs')
  , options

options = {
    host: 'google.com'
  , port: 80
  , path: '/images/srpr/logo3w.png'
}

function base64_encode(bitmap) {  
    return new Buffer(bitmap).toString('base64');
}

function ImageReady(res2){
    var request = http.get(options, function(res){
        var imagedata = '';
        res.setEncoding('binary');

        res.on('data', function(chunk){
            imagedata += chunk;
        })

        res.on('end', function(){
            var base64encode = base64_encode(imagedata);
            res2.end('<img src="data:image/png;base64,'+base64encode+'" />');
            fs.writeFile('logo.png', imagedata, 'binary', function(err){
            if (err) throw err
            console.log('File saved.')
        })
        })

    })
}

var httpListen = require('http');
httpListen.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    ImageReady(res);
}).listen(8080);
console.log('Server running!');

【问题讨论】:

    标签: node.js base64 encode


    【解决方案1】:

    试试这个:

    var loadBase64Image = function (url, callback) {
        // Required 'request' module
        var request = require('request');
    
        // Make request to our image url
        request({url: url, encoding: null}, function (err, res, body) {
            if (!err && res.statusCode == 200) {
                // So as encoding set to null then request body became Buffer object
                var base64prefix = 'data:' + res.headers['content-type'] + ';base64,'
                    , image = body.toString('base64');
                if (typeof callback == 'function') {
                    callback(image, base64prefix);
                }
            } else {
                throw new Error('Can not download image');
            }
        });
    };
    

    在你的 node.js 应用程序中使用:

    // ...
    loadBase64Image('http://upload.wikimedia.org/wikipedia/commons/thumb/9/9f/Carcharhinus_falciformis_off_Cuba.jpg/180px-Carcharhinus_falciformis_off_Cuba.jpg', function (image, prefix) {
        res.send('<img src="' + prefix + image + '"') />;
    });
    // ...
    

    【讨论】:

    • "encoding: null" 是处理下载二进制数据时最有价值的部分
    • 看起来你可以做 {encoding:'base64'} 并且它也可以工作,让你不必通过 body.toString('base64') 进行转换。
    • 感谢@Dnutry && @rbrc!
    【解决方案2】:

    尝试使用request npm 插件,

    app.get('/', function(req, res){
      if(req.param("url")) {
        var url = unescape(req.param("url"));
        var bl = new BufferList();
        request({uri:url, responseBodyStream: bl}, function (error, response, body) {
          if (!error && response.statusCode == 200) {
            var data_uri_prefix = "data:" + response.headers["content-type"] + ";base64,";
            var image = new Buffer(bl.toString(), 'binary').toString('base64');                                                                                                                                                                 
            image = data_uri_prefix + image;
            res.send('<img src="'+image+'"/>');
          }
        }); 
      }
    });
    

    更多信息:https://gist.github.com/583836

    【讨论】:

      【解决方案3】:

      我尝试使用@codef0rmer 代码,但没有成功……在阅读了 gist cmets 之后,我偶然发现了一个不依赖于“BufferList”外部库的解决方案,并且作为一种魅力发挥作用……

      这是link for this gist!它是用 Coffee 写的,所有感谢 @hackable:

      express = require("express")
      request = require("request")
      BufferList = require("bufferlist").BufferList //no longer needed
      app = express.createServer(express.logger(), express.bodyParser())
      app.get "/", (req, res) ->
        if req.param("url")
          url = unescape(req.param("url"))
          request
            uri: url
            encoding: 'binary'
          , (error, response, body) ->
            if not error and response.statusCode is 200
            data_uri_prefix = "data:" + response.headers["content-type"] + ";base64,"
              image = new Buffer(body.toString(), "binary").toString("base64")
              image = data_uri_prefix + image
              res.send "<img src=\"" + image + "\"/>"
      
      app.listen 3000
      

      【讨论】:

        【解决方案4】:

        我最近遇到了这种情况,我只是通过使用这个模块来克服它base64-img 它只是从 url 中提取 base64 编码的图像


        var base64Img = require('base64-img');
        
        base64Img.requestBase64(url, function (err, res, body) {
            if (err) console.log(err)
            else {
                console.log(res)
                console.log(body)  
            }
        });
        

        【讨论】:

          猜你喜欢
          • 2015-12-19
          • 2016-05-22
          • 2013-11-10
          • 1970-01-01
          • 1970-01-01
          • 2022-10-14
          • 1970-01-01
          • 2017-11-02
          • 2020-11-23
          相关资源
          最近更新 更多