使用zip.js通过XMLHttpRequest/AJAX调用在Node.js上读取zip文件

8

我正在尝试:

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

我成功地接收到文件的二进制数据,即成功的回调已被调用,但是在尝试执行getEntries时出现错误。我认为错误出现在发送流的方式上,请帮忙解决。

错误信息:

读取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;

});

我的Node服务器端代码:

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个回答

4

很可能你已经找到了解决方案。今天我也遇到了同样的问题,以下是我用纯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 reader需要blob而不是数组。因此,你应该将var a转换为blob,然后用于读取。


没有留下任何评论就点踩是不好的。你至少可以分享一下原因。 - Sandeep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接