node.js - Node js请求海量图片
问题描述
我正在尝试在节点 js(n > 3000)上请求大量图像,然后将它们保存到一个文件夹中。我尝试过使用请求库和请求承诺。问题是如果图片数量太大,有些图片没有完成下载,留下不完整的数据或出现错误(一个空的.jpeg文件)。有没有更好的方法来下载大量图片?当图片全部下载时,我还需要请求函数 compile() 将它们制作成视频。我为此使用ffmpeg。
以下是我尝试这样做的两种方法。
const req = require('request');
const request = require('request-promise');
const fs = require('fs');
const ffmpegPath = require('@ffmpeg-installer/ffmpeg').path;
const ffmpeg = require('fluent-ffmpeg');
ffmpeg.setFfmpegPath(ffmpegPath);
function downloadImgs(imgUrls) {
let promises = [];
let prom;
for (let i = 0; i < imgUrls.length; i++) {
imgPath = `assets/pics/st_${pad(i + 1, 3)}.jpg`
prom = request(imgUrls[i]);
prom.on('error', () => console.log('err'));
prom.pipe(fs.createWriteStream(imgPath));
promises.push(prom);
}
Promise.all(promises).then(() => {
console.log('I Run');
compilee();
});
//SECOND TRY-----------------------------------------
for (let i = 0; i < imgUrls.lengh; i++) {
imgUrl = imgUrls[i];
req(imgUrl)
.on('error', () => console.log("img error", imgUrl))
.pipe(fs.createWriteStream(`assets/pics/st_${pad(i + 1, 3)}.jpg`)).on('close', () => {
console.log('downloaded', x)
})
}
compilee();
//---------------------------------------------------------
function compilee() {
command
.on('end', onEnd)
// .on('progress', onProgress)
.on('error', onError)
.input('assets/pics/st_%03d.jpg')
.inputFPS(5)
.output('assets/output/pepe.mp4')
.outputFps(30)
.run();
}
我第一次遇到的错误: UnhandledPromiseRejectionWarning: RequestError: Error: socket hang up
第二个:错误:在 TLSSocket.emit (events.js:187:15) 在 endReadableNT (_stream_readable) 的 TLSSocket.socketOnEnd (_http_client.js:433:23) 处的套接字挂断.js:1098:12) 在 process.internalTickCallback (internal/process/next_tick.js:72:19) 代码:'ECONNRESET'}
另外,如果我想立即将视频发送到客户端,我应该在服务器上还是在客户端上下载图片。
解决方案
我可能会建议您使用异步库。Qu可能是一个很好的解决方案
var q = async.queue(function({url,index}, callback) {
// Do ur job here
}, 5);
// assign a callback
q.drain = function() {
console.log('All images downloaded');
};
// add items to the queue
for (let i = 0; i < imgUrls.length; i++) {
q.push({url : imgUrls[i], index : i});
}
Ofc 它不是一个有效的所有代码块,但它只是为了给你一个想法。希望能帮助到你
推荐阅读
- keras - 在 keras 中制作“非全连接”(单连接?)神经网络
- java - 订阅 MailChimp 列表:不支持“内容类型”
- regex - 如何从 reddit 帖子标题中提取年龄和性别?
- swift - 如何在 Swift 中使用 SimplePDF 生成 PDF
- html - 几个 iframe 之间的空白
- python - 每次出现 100 时都要计数的 python 代码有问题
- python - Pytorch:参数或大小发生变化时是否可以加载模型?
- .htaccess - .htaccess 将子目录重定向到查询字符串
- sql - SQL:按列名选择值
- java - com.cloudant.client.api.ClientBuilder 的 NoClassDefFoundError 但类存在