NodeJS:检查图像是否仅在途中下载

时间:2019-04-06 19:25:35

标签: node.js

我已经在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);
            });
        });
    });
}

部分下载的图像不会在此功能中触发任何错误。

我需要能够验证图像是否已完全下载(运行下载器时)。

编辑:我还需要能够以编程方式检查使用此脚本下载的图像,以识别仅中途下载的图像。有办法吗?

1 个答案:

答案 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));