使用zip.js通过Node.js上的xmlhttp / ajax调用来读取zip文件

我在尝试着 :

  1. 通过xmlhttp发送一个zip文件到客户端
  2. 然后使用zip.js读取文件并呈现其内容

我成功地收到文件的二进制文件,即成功的callback被称为,但我得到和错误,当我尝试做getEntries 。 我认为错误是与发送stream的方式,请帮助。

错误消息

阅读zip文件时出错

我的客户端代码(使用angular度):

$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; }); 

节点上我的服务器端代码:

 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); }); 

很可能您已经find了解决scheme。 我今天面对同样的问题,这是我如何解决它在纯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(); 

我在代码中看到的问题是,您正在将值更改为Uint8Array并将其分配给var a ,但仍使用blobreader中的原始数据。 另外blob阅读器需要blob,而不是一个数组。 所以你应该把var a转换成blob,然后用它来读取。