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)
谢谢.
根据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.
| 归档时间: |
|
| 查看次数: |
2523 次 |
| 最近记录: |