使用Node.js下载大文件时应用程序崩溃

3
我正在尝试编写一个程序,可以将HTTP URL转换为种子文件。该项目基本上适用于下载链接包含小文件的情况,比如1-500Mb的文件。我的问题是,如果文件大小超过这个范围,应用程序就会崩溃或超时。所以我想知道如何解决这个问题。以下是我的代码和Github链接。

https://github.com/savadks95/FireBit

var http          = require('http');
var webtorrentify = require('webtorrentify-link');
var fs            = require('fs');
var url           = require("url");
var path          = require("path");
var validUrl      = require('valid-url');
var express       = require('express');
var getUrls       = require('get-urls');
var remote        = require('remote-file-size');
var app           = express();

var downloadLink;
var fileName;
var fileSize;
var server;
var parsed;
var param;
var link;
var port;
port = process.env.PORT || 80;

app.get('/favicon.ico', function(req, res){
console.log('favicon request recived');
});
app.get('*', function(req, res){
    if(req.url==='/'){

      //app.use('/public/html', express.static(path.join(__dirname)));

    fs.readFile('public/html/index.html', function (err, data) {
    res.write(data);  
  });
  }else if (req.url === '/l?thelink='){
    fs.readFile('public/html/emptyRequest.html', function (err, data) {
      res.write(data);
      res.end();
  });
}else{
//---------Reciving Url--------------------
  console.log(req.query.thelink);
  downloadLink=req.query.thelink;
  //-----------------------------------------

  //------------checking for valid url-------
  if (validUrl.isUri(downloadLink)) {
    console.log('Looks like an URL');
    //-----------------------------------------

    //----------Extracting filename-------------
    parsed = url.parse(downloadLink);
    fileName = path.basename(parsed.pathname);
    console.log(path.basename(parsed.pathname));
    //-------------------------------------------

    //----------Finding File size----------------
    remote(downloadLink, function(err, o) {
      fileSize = (o/1024)/1024;
      console.log('size of ' + fileName + ' = ' + fileSize+" MB");  
    //-------------------------------------------
    if (fileSize < 501)
    {
    ///////////////Creating Torrent////////////////////
    webtorrentify(downloadLink)
      .then(function (buffer) {
         console.log('creating the torrent');
         //res.send('what is');
         //-------------------------------------------
         res.setHeader('Content-Type', 'application/x-bittorrent');
         res.setHeader('Content-Disposition', `inline; filename="${fileName}.torrent"`);
         res.setHeader('Cache-Control', 'public, max-age=2592000'); // 30 days
         res.send(buffer);
         console.log(fileName+'.torrent created');
         res.end();
         //-------------------------------------------
      });
    ////////////////////////////////////////////////
    }
    else{
      console.log('More than 500 MB');
      res.send("<h4> More than 500 MB or invalid URL </h4>");
    }
  });
  }
  else {
    console.log('not url');
    fs.readFile('public/html/404.html', function (err, data) {
      res.write(data);
      res.end();
    });

  }
}
});

app.listen(port);

console.log('server up and running', port);
1个回答

5
Node.js 的纯文件 (fs) 和大数据处理功能通常不能很好地处理超过 1GB 的文件,但只需一个额外的 NPM 包 EventStream,您就可以在不崩溃 Node 服务器的情况下解析大规模数据集。通过 EventStream 包,您可以下载 3GB 及以上的文件大小。
以下链接提供了详细的实现。我想重申,在下面的链接中给出的示例实现解决了您的大文件下载问题。您已经非常擅长将 http url 转换为 torrent 流的能力。

https://itnext.io/using-node-js-to-read-really-really-large-files-pt-1-d2057fe76b33

这里是 event-stream 模块的 NPM 包。

https://www.npmjs.com/package/event-stream

希望这有所帮助。

谢谢回复。正如您所注意到的,我正在使用一个名为“webtorrentify”的npm包来将直接URL转换为种子文件。正是这个包下载了要转换的文件。由于我是初学者,我不知道如何使用您提供的方法进行更新。您介意看一下并告诉我该怎么做吗? - Savad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接