2013-01-01 1 views
7

Je suis en train de télécharger des fichiers de nseindia.com et de décompresser en mémoire. J'utilise nodejs webkit et adm-zip. Je reçois une erreur sur la console:nodejs télécharger et décompresser le fichier de l'url, erreur No en-tête END trouvé

Non compressé Format zip non valide ou non pris en charge. Pas de tête FIN trouvé

code:

var http = require('http'), 
       fs = require('fs'), 
       request = require('request'), 
       AdmZip = require('adm-zip'), 
       out = fs.createWriteStream('data/nseeqbhav.zip'); // For saving NSE Equity bhavcopy 


// Downloading NSE Bhavcopy 
request(
      { method: 'GET', 
       uri: 'http://www.nseindia.com/content/historical/EQUITIES/2012/DEC/cm19DEC2012bhav.csv.zip', 
       headers: { "User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11", 
        "Referer": "http://www.nseindia.com/products/content/all_daily_reports.htm", 
        "Accept-Encoding": "gzip,deflate,sdch", 
        "encoding": "null", 
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
        "Cookie": "cookie" 
       } 
      } 
      ).pipe(out); 
      var zip = new AdmZip("data/nseeqbhav.zip"), 
      zipEntries = zip.getEntries(); 
      zip.extractAllTo(/*target path*/"data/unzip/", /*overwrite*/true); 

J'ai essayé de mettre fin à la suite du flux, mais sans succès.

out.end(); 
out.destroy(); 

Merci d'avance.

Répondre

8

Vous essayez de lire le fichier avant qu'il ne soit complètement écrit. Vous devez attendre la fin de l'écriture.

var http = require('http'), 
    fs = require('fs'), 
    request = require('request'), 
    AdmZip = require('adm-zip'), 
    out = fs.createWriteStream('data/nseeqbhav.zip'); // For saving NSE Equity bhavcopy 

// Downloading NSE Bhavcopy 
var req = request(
    { 
     method: 'GET', 
     uri: 'http://www.nseindia.com/content/historical/EQUITIES/2012/DEC/cm19DEC2012bhav.csv.zip', 
     headers: { "User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11", 
      "Referer": "http://www.nseindia.com/products/content/all_daily_reports.htm", 
      "Accept-Encoding": "gzip,deflate,sdch", 
      "encoding": "null", 
      "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
      "Cookie": "cookie" 
     } 
    } 
); 

req.pipe(out); 
req.on('end', function() { 
    var zip = new AdmZip("data/nseeqbhav.zip"), 
    zipEntries = zip.getEntries(); 
    zip.extractAllTo(/*target path*/"data/unzip/", /*overwrite*/true); 
}); 
+0

Merci Vadim. Ça a marché. Une question, si le fichier téléchargé (que nous décompressons) possède plusieurs zips, comment les extraire nous aussi? Il n'y a pas d'événement "fin" à adm-zip. – mrkanitkar

+0

Dans la mesure où je vois la méthode 'extractAllTo' est synchrone. Il bloque la boucle d'événement jusqu'à ce que l'extraction soit terminée. Vous n'avez donc pas besoin d'un événement 'end' ici. Soyez prudent avec les bibliothèques synchrones. Ce n'est pas node.js et peut provoquer des gels sur highload. –

Questions connexes