image-size 模块 提供了一种方法:
let url = require('url');
let http = require('http');
let sizeOf = require('image-size');
let imgUrl = 'http://my-amazing-website.com/image.png';
let options = url.parse(imgUrl);
http.get(options, function (response) {
let chunks = [];
response.on('data', function (chunk) {
chunks.push(chunk);
}).on('end', function() {
let buffer = Buffer.concat(chunks);
console.log(sizeOf(buffer)); // { width: 100, height: 100, type: 'png' }
});
});
Async/await 形式:
function test() {
return new Promise((resolve, reject) => {
http.get(imgUrl, (response) => {
let chunks = [];
response.on('data', (chunk) => {
chunks.push(chunk);
}).on('end', () => {
let buffer = Buffer.concat(chunks);
resolve(sizeOf(buffer));
});
}).on('error', (error) => {
reject(error);
});
});
};
(async () => {
try {
console.log(await test());
} catch (error) {
console.log(error);
}
})();
request 模块实现:
request({
url: imgUrl,
encoding: null
}, function(err, res, body) {
let buffer = body;
console.log(sizeOf(buffer));
});
request-promise 模块实现:
async function test() {
let result = await rp({url: imgUrl,
encoding: null});
let buffer = result;
console.log(sizeOf(buffer));
}
test();
注意:按照 request 官方的说法
If null, the body is returned as a Buffer。 如果设置 encoding 为 null,那么返回的 body 就是 buffer。
request 库默认的 encoding 是 utf8,所以如果不传 encoding 这个参数,响应后会按 utf8 再编码。
buffer 默认(未被encoding前)低层是UInt8Array
实现的。并不是按binary
编码的。
// request 源码
// https://github.com/request/request/blob/b12a6245d9acdb1e13c6486d427801e123fdafae/request.js#L1136
if (self.encoding !== null) {
response.body = response.body.toString(self.encoding)
}
// 这样就是回调前 toString('binary'),而 sizeOf 需要的是默认的(未)编码buffer
request({
'url': imgUrl,
'encoding': 'binary'
}, function (err, res, body) {
console.log(sizeOf(Buffer.from(body, 'binary')));
})
binary
也是诸多编码方式之一,与base64
hex
utf8
类似
另一点binary
跟utf8
不同的是,utf8
编码后不能转回原始的二进制,见例子