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

时间:2014-12-01 03:40:40

标签: javascript node.js download arraybuffer zip.js

我想:

  1. 通过xmlhttp将zip文件发送到客户端
  2. 然后使用zip.js读取文件并呈现其内容
  3. 我成功收到文件的二进制文件,即成功回调被调用,但是当我尝试 getEntries 时,我得到并出错。我认为错误在于发送流的方式,请帮忙。

    错误消息

      

    读取zip文件时出错

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

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

1 个答案:

答案 0 :(得分:3)

您可能已经找到了解决方案。我今天遇到了同样的问题,这就是我在简单的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,然后将其用于阅读。