node js请求海量图片
Node js request huge amount of pictures
我正在尝试在节点 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
和 第二个 :
错误:套接字挂起
在 createHangUpError (_http_client.js:330:15)
在 TLSSocket.socketOnEnd (_http_client.js:433:23)
在 TLSSocket.emit (events.js:187:15)
在 endReadableNT (_stream_readable.js:1098:12)
在 process.internalTickCallback
(internal/process/next_tick.js:72:19) 代码:'ECONNRESET' }
还有,如果我想立即把视频发给客户端,应该在服务器上下载图片还是在客户端下载呢?
我可能会建议您使用异步库。 Que 可能是一个很好的解决方案
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 它不是一个工作的所有代码块,但它只是给你一个想法。希望对你有帮助
我正在尝试在节点 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
和 第二个 : 错误:套接字挂起 在 createHangUpError (_http_client.js:330:15) 在 TLSSocket.socketOnEnd (_http_client.js:433:23) 在 TLSSocket.emit (events.js:187:15) 在 endReadableNT (_stream_readable.js:1098:12) 在 process.internalTickCallback (internal/process/next_tick.js:72:19) 代码:'ECONNRESET' }
还有,如果我想立即把视频发给客户端,应该在服务器上下载图片还是在客户端下载呢?
我可能会建议您使用异步库。 Que 可能是一个很好的解决方案
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 它不是一个工作的所有代码块,但它只是给你一个想法。希望对你有帮助