我正在尝试编写一个脚本来使用node.js下载图像。这是我到目前为止的内容:
var maxLength = 10 // 10mb var download = function(uri, callback) { http.request(uri) .on('response', function(res) { if (res.headers['content-length'] > maxLength*1024*1024) { callback(new Error('Image too large.')) } else if (!~[200, 304].indexOf(res.statusCode)) { callback(new Error('Received an invalid status code.')) } else if (!res.headers['content-type'].match(/image/)) { callback(new Error('Not an image.')) } else { var body = '' res.setEncoding('binary') res .on('error', function(err) { callback(err) }) .on('data', function(chunk) { body += chunk }) .on('end', function() { // What about Windows?! var path = '/tmp/' + Math.random().toString().split('.').pop() fs.writeFile(path, body, 'binary', function(err) { callback(err, path) }) }) } }) .on('error', function(err) { callback(err) }) .end(); }
但是,我想使它更强大:
binary
原因:对于类似于imgur的功能(用户可以给我一个URL),我下载了该图像,然后以多种尺寸重新托管该图像。
我建议使用request模块。下载文件与以下代码一样简单:
var fs = require('fs'), request = require('request'); var download = function(uri, filename, callback){ request.head(uri, function(err, res, body){ console.log('content-type:', res.headers['content-type']); console.log('content-length:', res.headers['content-length']); request(uri).pipe(fs.createWriteStream(filename)).on('close', callback); }); }; download('https://www.google.com/images/srpr/logo3w.png', 'google.png', function(){ console.log('done'); });