首页 > 解决方案 > 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'}

另外,如果我想立即将视频发送到客户端,我应该在服务器上还是在客户端上下载图片。

标签: node.jsffmpegrequestrequest-promisefluent-ffmpeg

解决方案


我可能会建议您使用异步库。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 它不是一个有效的所有代码块,但它只是为了给你一个想法。希望能帮助到你


推荐阅读