2011-01-28 98 views
5

我在node.js上创建了一个函数来启动文件下载,但是我想创建一个规则,在该规则下载函数之前函数检查文件大小数据。根据文件大小取消node.js http.Client上的文件下载/请求

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

这里是我的代码片段:

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 

感谢。

回答

7

根据HTTP协议规范9.4 HEAD

的HEAD方法等同于GET 不同的是在响应服务器不能返回 消息正文。响应于HEAD请求 的HTTP 头中包含的元信息应当与响应于GET请求发送的信息 相同。 此方法可用于获取 有关实体 的元信息,该请求暗示请求没有 传输实体主体本身。 此方法通常用于测试 有效性的超文本链接, 可访问性和最近的 修改。

到HEAD请求的响应可以是在这个意义上 缓存包含在响应 的 信息可被用于更新从该资源的先前 高速缓存的实体。如果 新的字段值表明 缓存的实体从目前 实体的不同(如将在内容长度,内容,MD5, ETag的或上次修改一个 变化来表示),那么缓存 必须把缓存条目为陈旧。

如果你的服务器没有正确响应这个,我想你可能会不幸运? 接下来只是简单地使用google.request('HEAD'代替google.request('GET'


一些代码

我测试下面的下面。 fake.js只是一个使用快递进行测试的假服务器。

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客户端测试头。 测试。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'); 
}); 

[email protected]:~/node/stackoverflow/4832362$ curl http://localhost:3000/count 
0 

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

[email protected]:~/node/stackoverflow/4832362$ curl http://localhost:3000/count 
0 

正如你可以看到仍为0

+0

太棒了!谢谢。 – Carlosedp 2011-01-29 15:39:09