bet*_*max 15 javascript base64 image node.js
使用Node v0.2.0我试图从服务器获取图像,将其转换为base64字符串,然后将其嵌入到图像标记的页面上.我有以下代码:
var express = require('express'),
request = require('request'),
sys = require('sys');
var app = express.createServer(
express.logger(),
express.bodyDecoder()
);
app.get('/', function(req, res){
if(req.param("url")) {
var url = unescape(req.param("url"));
request({uri:url}, function (error, response, body) {
if (!error && response.statusCode == 200) {
var data_uri_prefix = "data:" + response.headers["content-type"] + ";base64,";
var buf = new Buffer(body);
var image = buf.toString('base64');
image = data_uri_prefix + image;
res.send('<img src="'+image+'"/>');
}
});
}
});
app.listen(3000);
Run Code Online (Sandbox Code Playgroud)
注意:此代码需要" express "和" request ".当然还有节点.如果您安装了npm,它应该像"npm install express"或"npm install request"一样简单.
不幸的是,这不能按预期工作.如果我使用Google徽标进行转换,那么我会在字符串的开头获得以下内容:
77 + 9UE5HDQoaCgAAAA1JSERSAAABEwAAAF8IAwAAAO +/VE +/VE +/vSkAAAMAUExURQBzCw5xGiNmK0t + U + +/+ vQUf77 + 9BiHvv70WKO/vQkk77 + 9D
但是,如果我使用具有相同图像的在线Base64编码器,那么它可以完美地工作.字符串的开头如下:
iVBORw0KGgoAAAANSUhEUgAAARMAAABfCAMAAAD8mtMpAAADAFBMVEUAcwsOcRojZitLflOWBR + aBiGQFiipCSS8DCm1Cya1FiyNKzexKTjDDSrLDS
我哪里错了,这不能正常工作?我已经尝试了很多不同的js base64实现,但它们都不能以相同的方式工作.我唯一能想到的是我试图将错误的东西转换成base64,但是如果是这样的话我应该转换什么呢?
bxj*_*xjx 13
问题是在javascript字符串中编码和存储二进制数据.在http://nodejs.org/api.html上的Buffers下有一个相当不错的部分.
不幸的是,最简单的解决方法是更改请求npm.我不得不在/path/to/lib/node/.npm/request/active/package/lib/main.js response.setEncoding('binary');下面的第66行添加var buffer;.这适用于此请求但不适用于其他请求.您可能想要破解它,以便仅基于其他一些传递选项进行设置.
然后我改var buf = new Buffer(body)到var buf = new Buffer(body, 'binary');.在此之后,一切正常.
另一种方法是,如果你真的不想触摸请求npm,那就是在requestBodyStream参数中传入一个实现Writable Stream的对象来请求.然后,该对象将响应中的流数据存储在自己的缓冲区中.也许有一个图书馆已经这样做了...我不确定.
我现在要把它留在这里,但如果你想让我澄清任何事情,请随时评论.
编辑
查看评论.http://gist.github.com/583836上的新解决方案
小智 8
以下代码(可从https://gist.github.com/804225获取)
var URL = require('url'),
sURL = 'http://nodejs.org/logo.png',
oURL = URL.parse(sURL),
http = require('http'),
client = http.createClient(80, oURL.hostname),
request = client.request('GET', oURL.pathname, {'host': oURL.hostname})
;
request.end();
request.on('response', function (response)
{
var type = response.headers["content-type"],
prefix = "data:" + type + ";base64,",
body = "";
response.setEncoding('binary');
response.on('end', function () {
var base64 = new Buffer(body, 'binary').toString('base64'),
data = prefix + base64;
console.log(data);
});
response.on('data', function (chunk) {
if (response.statusCode == 200) body += chunk;
});
});
Run Code Online (Sandbox Code Playgroud)
还应该生成数据URI而不需要任何外部模块.
| 归档时间: |
|
| 查看次数: |
27612 次 |
| 最近记录: |