我如何才能在node.js中只下载第一个10千字节的文件

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

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

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

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

 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); } }); }) 

这段代码将为一个文件创build一个inputstream,并将请求的主体传递给这个文件(即,接收到的每个数据块将被附加到文件中)。

如果你不想用缓冲区做任何事情,你不需要保留它,你可以只计算接收到的字节数,并在需要时停止。

 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(); } }); }) 

最好的祝福,