发布一个base64图像Imgur

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是我从URL下载的string。 当我执行它时,我得到:

 querystring.js:114 return encodeURIComponent(str); ^ URIError: URI malformed 

如何正确提交邮政数据给Imgur ?

这是事情:你的img将是一个二进制数据的string,它不会正确base64编码。 正如switewvu24提到的,当你使用base64编码时,你想要有一个缓冲区。 不幸的是,这个解决scheme也不是很正确。

从你已经有的最less的变化,将是这样一个新的缓冲区:

 var data = querystring.stringify({ image: new Buffer(img, 'binary').toString('base64') }); 

请注意'binary' ,这将确保您获得正确的数据转换。 另一个解决scheme是,当你下载图像时,而不是连接一个string,而是收集数组中的所有块,然后用Buffer.concat创build一个缓冲区:

 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' }); // ... 

尝试

 var data = querystring.stringify({
   image:new Buffer(img).toString('base64')
 });