node.js - Node JS https 检查下载的图像是否 100% 完成
问题描述
我的应用程序使用 NodeJS https 模块实现了图像下载功能。下载很好,但有时(没有明确原因),下载的图像不完整/包含灰色区域
const fs = require('fs'), https = require('https');
// ...
return new Promise(async (res) => {
// ...
// assume var url = 'https://example.com/image.jpg'
let file = fs.createWriteStream('./image.jpg');
await https.get(url, async (response) => {
response.pipe(file).on("finish", () => res(true))
}).on("error", err => res(err.stack))
})
正如您在上面看到的(以及图像的描述),失败的图像没有引发任何错误( .on('err'... failed to catch anything)
在调用 Promise 的 resolve() 之前,如何检查/验证下载的图像是否 100% 完成?
解决方案
我想我找到了。因此,对于任何与我有相同问题的人,我想在这里分享我的答案
我不得不切换到 node-fetch,所以如果您正在寻找 http 解决方案,那么我很抱歉,但我不知道如何。
const fs = require('fs'), fetch= require('https');
var w_size: number = 0 // file size from URL
await (async (url: string) => {
return new Promise<Buffer>(resolve =>
resolve(fetch(url)
.then((r) => { /* get file size from header */ w_size = parseInt(r.headers.get('content-length') || '0'); return r })
.then(res => res.arrayBuffer())
.then(buff => Buffer.from(buff)))
)
})(url).then(async (buffer) => {
console.log('Writing');
await fs.writeFileSync(downloadedFilePath, buffer);
if (w_size) { // if w_size == 0 (means failed to get ['content-length'] from headers), jump to else
var getPercent = fs.statSync(downloadedFilePath).size;
if (Math.round((getPercent / w_size) * 100) < 99) { // minimum of 99 percent complete, or if you want to be strict, use <= 99 to make sure it's 100%
// Partial download (download failed)
console.log(`Error:\nBuffer end before whole file finished downloading (partial download)`)
throw new Error('Partial download detected')
}
else {...} // Download success
}
else {...} // default behavior if failed to get w_size from URL (means original / meant-to-be size is unknown)
})
推荐阅读
- python - 期望在 json 中用双引号括起来的属性名称
- flutter - Flutter 管理所有额外的参数
- javascript - 是否可以从谷歌表格中读取值并替换谷歌文档中的某些文本标志?
- c++ - 为什么我没有得到数组超出范围错误?
- vue.js - Vue 路由器无法从嵌套视图嵌套子级访问根应用程序路径“/”
- javascript - 如何使用 Jquery 或 Javascript 在 Class 之后插入 Div?
- python - 如何在 Python 中将 HH:MM:SS 时间转换为十进制
- c# - 依赖属性在用户控件中不起作用
- javascript - “语法错误:NodeJS 中的意外标记 =”
- python - python3 how to change the atribute .P0 with passing argument to call