我已经在node.js中创建了一个图像下载器。但是,在下载图像时,下载有可能无法完成,给我留下了部分下载的图像(looks like this)。这是我用来下载图片的功能:
const fs = require('fs-extra');
var progress = require('request-progress');
var probe = require('probe-image-size');
...
downloadImage(url, filename) {
return new Promise((resolve, reject) => {
var req = request(url);
if (!fs.existsSync(dirname)) fs.ensureDirSync(path.dirname(filename));
var image;
var bytes;
var type;
progress(req, { delay: 0 }).on('progress', function (state) {
reportDownloadSpeed(status.speed);
})
.on('response', response => {
if (response.statusCode == 200) {
type = mime.getExtension(response.headers['content-type']);
filename = filename + '.' + type;
image = fs.createWriteStream(filename);
bytes = response.headers['content-length'];
req.pipe(image);
} else {
reject(response.statusCode);
}
})
.on('error', function (error) {
reject(error);
})
.on('end', function () {
image.close();
var input = require('fs').createReadStream(filename);
// Get the width and height
probe(input).then(result => {
input.destroy();
if (result != null) {
resolve({
'bytes': bytes,
'width': result.width,
'height': result.height,
'type': type
});
} else {
reject('Not an image or corrupt');
}
}).catch((error) => {
reject(error);
});
});
});
}
部分下载的图像不会在此功能中触发任何错误。
我需要能够验证图像是否已完全下载(运行下载器时)。
编辑:我还需要能够以编程方式检查使用此脚本下载的图像,以识别仅中途下载的图像。有办法吗?
答案 0 :(得分:0)
可以在接收所有数据之前触发响应事件。 pipe
方法可用于在数据流可用时将其写入目标流,并且应继续写入直到没有更多数据为止。如果状态不是200(否则可能包含错误响应),则可以捕获状态代码并删除文件。
...
let response = null;
...
progress(request(url)
).on('progress', function(state){
reportDownloadSpeed(state.speed);
}).on('end', function () {
if (response.statusCode != 200){
console.log(`remove: ${filename}`);
fs.unlinkSync(filename);
}
}).on('response', function(resp){
response = resp;
}).on('error', function(resp){
reject(error);
}).pipe(fs.createWriteStream(filename));