我在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
感谢。
答案 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。