2011-01-28 3 views
5

J'ai fait une fonction sur node.js pour commencer un téléchargement de fichier mais je veux créer une règle où la fonction vérifie la taille du fichier avant de télécharger le Les données.Annuler un téléchargement de fichier/demande sur node.js http.Client basé sur la taille de fichier

J'ai obtenu les en-têtes de réponse et vérifié la taille mais je ne sais pas comment tout annuler en transférant les données/corps réels. Peut-être qu'il y a un moyen de transférer seulement les en-têtes en premier et le, si cela correspond à ma règle, je peux tirer une autre requête pour faire le téléchargement.

Voici un fragment de mon code:

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 

Merci.

Répondre

7

selon les spécifications du protocole HTTP 9.4 HEAD

La méthode HEAD est identique à GET sauf que le serveur NE DOIT PAS retourner un corps de message dans la réponse. La méta-information contenue dans les en-têtes HTTP en réponse à une demande HEAD DEVRAIT être identique à l'information envoyée en réponse à une requête GET. Cette méthode peut être utilisée pour obtenir une méta-information concernant l'entité impliquée par la demande sans transférant le corps d'entité lui-même. Cette méthode est souvent utilisée pour tester les liens hypertextes pour la validité, l'accessibilité et la modification récente .

La réponse à une demande de tête peut être cacheable dans le sens où les informations contenues dans la réponse PEUT être utilisée pour mettre à jour une entité précédemment en cache de cette ressource. Si les nouvelles valeurs de champ indiquent que la entité en cache diffère de l'entité actuelle (comme cela sera indiqué par un changement Content-Length, Content-MD5, ETag ou dernière modification), le cache DOIT traiter l'entrée du cache est obsolète.

Si votre serveur ne répond pas correctement à ce que je pense que vous pourriez ne pas avoir de chance? Ensuite tout simplement utiliser google.request('HEAD' au lieu de google.request('GET'


Certains Code

Je l'ai testé ce qui suit ci-dessous. fake.js est juste un faux serveur utilisant express pour tester.

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 est de tester la tête de 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'); 
}); 

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

[email protected]:~/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 

Comme vous pouvez le voir encore 0.

+0

fantastique! Merci. – Carlosedp

+0

votre accueil: P – Alfred

Questions connexes