发布一个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') });