如何在node.js中只下载文件的前10 KB

how can I download only first 10 kilobyte of a file in node.js

本文关键字:文件 KB 下载 node js      更新时间:2023-09-26

在node.js中,我如何下载特定数量的文件,比如文件的前10 KB。

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

正如一些人在这里所说,如果你下载(至少)文件的前32kB,你应该可以下载大多数MP3文件。

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

致问候,