Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据文件大小取消node.js http.Client上的文件下载/请求_Javascript_Node.js - Fatal编程技术网

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

Javascript 根据文件大小取消node.js http.Client上的文件下载/请求,javascript,node.js,Javascript,Node.js,我在node.js上创建了一个函数来启动文件下载,但我想创建一个规则,该函数在下载数据之前检查文件大小 我得到了响应标题并检查了大小,但我不知道如何在不传输实际数据/正文的情况下取消所有操作。也许有一种方法可以首先只传输头,如果符合我的规则,我可以发出另一个请求进行下载 以下是我的代码片段: request.on('response', function(response) { var filesize = response.headers['content-length'];

我在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

谢谢。

根据HTTP协议规范

HEAD方法与GET方法相同 但服务器不能返回 响应中的消息正文。这个 HTTP中包含的元信息 响应头请求的头 应与信息相同 为响应GET请求而发送。 此方法可用于获取 有关实体的元信息 由请求默示,无需 转移实体本身。 这种方法通常用于测试 超文本链接的有效性, 可访问性,以及最近的 修改

对HEAD请求的响应可以是 可缓存的,即 答复中所载的资料 可用于更新以前的 来自该资源的缓存实体。如果 新字段值表示 缓存的实体与当前实体不同 实体(如 内容长度的变化,Content-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)
}
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');
});
js是从http客户端测试头部。 test.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)
}
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');
});



如您所见,仍然是0

alfred@alfred-laptop:~/node/stackoverflow/4832362$ curl http://localhost:3000/count
0