2014-12-01 22 views
7

próbuję:użyciu zip.js odczytać plik zip za pomocą XMLHTTP/wywołania ajax na node.js

  1. Wyślij plik zip poprzez XMLHTTP do klienta
  2. następnie odczytać pliku przy użyciu zip.js i czynią jego zawartość

pomyślnie odbierać binarnego pliku tj zwrotnego sukces nazywa, ale pojawia się błąd i gdy próbuję zrobić getEntries. Myślę, że błąd wynika ze sposobu wysyłania strumienia, proszę o pomoc.

Error msg:

Błąd odczytu pliku zip

mojego kodu po stronie klienta (przy użyciu kątowa):

$http.get(window.location.origin + '/book/'+bookName,{responseType:"Blob"}). 
success(function (data , error) { 
    var a = new Uint8Array(data); 
     //var dataView = new DataView(data); 
     //var blob = new Blob(dataView.buffer); 
    zip.useWebWorkers = true; 
    zip.workerScriptsPath = '/js/app/'; 

    zip.createReader(new zip.BlobReader(data), function(reader) { 

     // get all entries from the zip 
     reader.getEntries(function(entries) { //HERE I GET THE ERROR 
     if (entries.length) { 

      // get first entry content as text 
      entries[0].getData(new zip.TextWriter(), function(text) { 
      // text contains the entry data as a String 
      console.log(text); 

      // close the zip reader 
      reader.close(function() { 
       // onclose callback 
       var a = 0; 
      }); 

      }, function(current, total) { 
      // onprogress callback 
      var a = 0; 
      }); 
     } 
     }); 
    }, 
    function(error) { 
     // onerror callback 
     var a = 0; 
    }); 


}) 
.error(function (data , error) { 
    var a = 0; 

}); 

moim serwerze kodu z boku na węźle:

router.get('/book/:bookName',function (req , res) { 


console.log('Inside book reading block : ' + req.params.bookName); 
req.params.bookName += '.zip'; 

var filePath = path.join(__dirname,'/../\\public\\books\\' ,req.params.bookName); 
var stat = fileSystem.statSync(filePath); 

res.writeHead(200, { 
    //'Content-Type': 'application/zip', 
    'Content-Type': 'blob', 
    'Content-Length': stat.size 
}); 

var readStream = fileSystem.createReadStream(filePath); 
// replace all the event handlers with a simple call to readStream.pipe() 
readStream.pipe(res); 
}); 

Odpowiedz

2

Prawdopodobnie już znalazłeś rozwiązanie. I w obliczu tego samego problemu dzisiaj i to w jaki sposób rozwiązać go w zwykły javascript:

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'assets/object/sample.zip', true); 
xhr.responseType = 'arraybuffer'; 

xhr.onload = function(e) { 
    // response is unsigned 8 bit integer 
    var responseArray = new Uint8Array(this.response); 
    var blobData = new Blob([responseArray], { 
     type: 'application/zip' 
    }); 
    zip.createReader(new zip.BlobReader(blobData), function(zipReader) { 
     zipReader.getEntries(displayEntries); 
    }, onerror); 
}; 

xhr.send(); 

Problem widzę w kodzie jest to, że zmieniają wartość Uint8Array i przypisanie go do var a, ale nadal używać surowe dane w blobreaderze. Również czytnik blob wymaga bloba, a nie tablicy. Więc powinieneś przekonwertować var a na obiekt typu blob, a następnie użyć go do odczytu.

+0

Downvote bez komentarza. Możesz przynajmniej podzielić się przyczyną. – Sandeep