根据文件大小取消node.js http.Client上的文件下载/请求

Car*_*edp 5 javascript node.js

我在node.js上创建了一个函数来启动文件下载但是我想创建一个规则,其中函数在下载数据之前检查文件大小.

我得到了响应标题并检查了大小,但我不知道如何通过传输实际数据/正文来取消所有内容.也许有一种方法只能首先传输标题,如果符合我的规则,我可以触发另一个请求进行下载.

这是我的代码片段:

request.on('response', function(response) {
        var filesize = response.headers['content-length'];
        console.log("File size " + filename + ": " + filesize + " bytes.");
        response.pause();
        if (filesize >= 50000) {
            // WHAT TO PUT HERE TO CANCEL THE DOWNLOAD?
            console.log("Download cancelled. File too big.");
        } else {
            response.resume();
        }
        //Create file and write the data chunks to it
Run Code Online (Sandbox Code Playgroud)

谢谢.

Alf*_*red 7

根据HTTP协议规范9.4 HEAD

HEAD方法与GET相同,只是服务器不能在响应中返回消息体.响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同.该方法可用于获得关于请求所暗示的实体的元信息,而无需转移实体主体本身.此方法通常用于测试超文本链接的有效性,可访问性和最近的修改.

对于HEAD请求的响应可以是可缓存的,因为响应中包含的信息可以用于从该资源更新先前缓存的实体.如果新的字段值指示缓存的实体从当前实体的不同(如将在内容长度,内容,MD5,ETag的或上次修改的变化来表示),那么缓存必须把缓存条目为陈旧.

如果您的服务器对此没有正确响应,我想您可能运气不好?接下来只需使用google.request('HEAD'而不是google.request('GET'


一些代码

我测试了以下内容.fake.js只是一个使用express来测试的假服务器.

fake.js:

var HOST = 'localhost';
var PORT = 3000;
var connections = 0;
var express = require('express');
var app = module.exports = express.createServer();

if (process.argv[2] && process.argv[3]) {
    HOST = process.argv[2];
    PORT = process.argv[3];
}

app.use(express.staticProvider(__dirname + '/public'));

// to reconnect.
app.get('/small', function(req,  res) {
    console.log(req.method);
    if (req.method == 'HEAD') {
        console.log('here');
        res.send('');
    } else {
        connections++;
        res.send('small');    
    }
});

app.get('/count', function(req, res) {
    res.send('' + connections);
});

app.get('/reset', function(req, res) {
    connections = 0;
    res.send('reset');
});


if (!module.parent) {
    app.listen(PORT, HOST);
    console.log("Express server listening on port %d", app.address().port)
}
Run Code Online (Sandbox Code Playgroud)

test.js是从http-client测试头. test.js:

var http = require('http');
var google = http.createClient(3000, 'localhost');
var request = google.request('HEAD', '/small',
  {'host': 'localhost'});
request.end();
request.on('response', function (response) {
  console.log('STATUS: ' + response.statusCode);
  console.log('HEADERS: ' + JSON.stringify(response.headers));
  response.setEncoding('utf8');
});
Run Code Online (Sandbox Code Playgroud)
alfred@alfred-laptop:~/node/stackoverflow/4832362$ curl http://localhost:3000/count
0
Run Code Online (Sandbox Code Playgroud)
alfred@alfred-laptop:~/node/stackoverflow/4832362$ node test.js 
STATUS: 200
HEADERS: {"content-type":"text/html; charset=utf-8","content-length":"0","connection":"close"}
Run Code Online (Sandbox Code Playgroud)
alfred@alfred-laptop:~/node/stackoverflow/4832362$ curl http://localhost:3000/count
0
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样仍然是0.