http.get('http://path/to/image.jpg', function (res) {
var img = '';
res.on('data', function (buff) {
img += buff;
});
res.on('end', function () {
var data = querystring.stringify({
image: img.toString('base64'),
type: 'base64'
});
var opts = {
host: 'api.imgur.com',
path: '/3/image',
method: 'POST',
headers: {
'Authorization': 'Client-ID myId',
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': data.length
}
};
var req = https.request(opts, function (res) {
res.on('data', function (buff) {
console.log(buff.toString());
});
});
req.end(data);
});
});
img
是我从网址下载的字符串。当我执行它时,我得到了:
querystring.js:114
return encodeURIComponent(str);
^
URIError: URI malformed
如何正确地将帖子数据提交给Imgur?
答案 0 :(得分:1)
这就是:你的img
将是一个包含二进制数据的字符串,并且它不会被正确地进行base64编码。正如switewvu24所提到的,你想在base64-encode时有一个缓冲区。不幸的是,这个解决方案也不太正确。
与你已经拥有的最小的变化是创建一个像这样的新缓冲区:
var data = querystring.stringify({
image: new Buffer(img, 'binary').toString('base64')
});
请注意'binary'
,这将确保您获得正确的数据转换。另一个解决方案是,在下载图像时,不是连接字符串,而是收集数组中的所有块,然后使用Buffer.concat
创建缓冲区:
http.get('http://path/to/image.jpg', function (res) {
var imgData = [];
res.on('data', function (buff) {
imgData.push(buff);
});
res.on('end', function () {
var img = Buffer.concat(imgData);
var data = querystring.stringify({
image: img.toString('base64'),
type: 'base64'
});
// ...
答案 1 :(得分:0)
尝试
var data = querystring.stringify({ image: new Buffer(img).toString('base64') });