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

时间:2011-01-28 19:41:32

标签: 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

感谢。

1 个答案:

答案 0 :(得分:7)

根据HTTP协议规范9.4 HEAD

  

HEAD方法与GET相同   除了服务器不能返回   响应中的消息正文。该   HTTP中包含的元信息   响应HEAD请求的标头   应该与信息完全相同   发送以响应GET请求。   该方法可用于获得   关于实体的元信息   没有提出要求所暗示的   转移实体 - 身体本身。   此方法通常用于测试   有效性的超文本链接,   可访问性,最近   修改

     

对HEAD请求的响应可能是   可缓存的意思是   回复中包含的信息   可以用来更新以前的   来自该资源的缓存实体。如果   新的字段值表明了   缓存实体与当前不同   实体(由a表示)   Content-Length,Content-MD5的变化,   ETag或Last-Modified),然后是缓存   必须将缓存条目视为陈旧。

如果你的服务器对此没有正确回应,我想你可能运气不好? 接下来只需使用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)
}

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

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

alfred@alfred-laptop:~/node/stackoverflow/4832362$ node test.js 
STATUS: 200
HEADERS: {"content-type":"text/html; charset=utf-8","content-length":"0","connection":"close"}

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

你仍然可以看到0。