2015-04-04 25 views
1

在node.js中,如何才能下载特定数量的文件,例如只有前10千字节的文件。如何才能在node.js中下载第一个10千字节的文件

在我的项目中,我需要从远程文件中提取mp3持续时间和比特率,我认为唯一的方法就是将几个字节下载到整个文件中。

正如有些人所说here如果您下载(至少)该文件的第一个32kB,你应该可以为大多数MP3文件。

+0

开始下载,收听数据事件,跟踪你多少字节读取和中止后10KB – 2015-04-04 17:37:35

+0

@BenjaminGruenbaum你有什么例子,我在一个新手node.js中 – alireza 2015-04-04 17:40:07

回答

2

在Node.js中,您知道一块数据何时可用。如果你做了一个http请求,你会得到一个包含头文件的响应对象。这个响应对象也是一个包含事件的流。您正在搜索的是"data"。通过这个事件,你会得到一个充满接收数据的缓冲区(只有新数据,以前收到的数据块不存在)。每当你得到一块数据时,你只需要有一个缓冲区并追加到它。你也可以获得缓冲区的长度。当您有足够的数据使用方法destroy方法时,您可以选择停止下载数据。这里是一个例子:

var http = require("http"); 
var buff = new Buffer(0); 
http.get("http://epfl.ch", function(res) { 
    res.on('data', function(chunk) { 
     buff = Buffer.concat([buff, chunk]); 
     if (buff.length > 10240) { 
      res.destroy(); 
      console.log(buff); 
     } 
    }); 
}) 

这段代码将等待提取10kb字节,然后结束请求。然后,你可以斗要与数据的任何(BUFF)

如果你想将数据保存到文件下载时,你可以这样做,而不是:

var http = require("http"); 
var buff = new Buffer(0); 
var fs = require("fs"); 

var file = fs.createWriteStream("file.mp3"); 

http.get("http://epfl.ch", function(res) { 
    res.pipe(file); 
    res.on('data', function(chunk) { 
     buff = Buffer.concat([buff, chunk]); 
     if (buff.length > 10240) { 
      res.destroy(); 
      file.close(); 
      console.log(buff); 
     } 
    }); 
}) 

此代码将创建一个输入流文件并将请求的主体传递给此文件(即,接收到的每个数据块都将附加到文件中)。

如果您不想对缓冲区执行任何操作,则不需要保留该缓冲区,只需计算接收到的字节数,并在需要时停止。

var http = require("http"); 
var bytesRecieved = 0; 
var fs = require("fs"); 

var file = fs.createWriteStream("file.mp3"); 

    http.get("http://epfl.ch", function(res) { 
     res.pipe(file); 
     res.on('data', function(chunk) {    
      bytesRecieved += chunk.length; 
      if (bytesRecieved > 10240) { 
       res.destroy(); 
       file.close(); 
      } 
     }); 
    }) 

最好的问候,

+0

谢谢,如果提取10kb的mp3文件,extraxting持续时间和比特率我需要保存到新文件,而不是使用id3js? – alireza 2015-04-04 18:10:50

+1

我用这个信息更新了我的答案 – 2015-04-04 18:26:00

相关问题