Search code examples
javascriptxmlhttprequestclient-side-scriptingzip.js

zip.js : File format is not recognized, javascript


I am getting a zip file response from a HTTP GET request which contains two other files in it of extensions .log and .out. I am using zip.js to successfully read the data from the .log file but when I try to pass the text data, read from the .log file, as an argument to an event , I get the error :

"File Format is not recognized"

I am doing this on client-side javascript.

Here is my code :

var xhr = new XMLHttpRequest();
xhr.onload = function(e) {
    var blobData = new Blob([this.response],{type : "application/zip"});
    zip.createReader(new zip.BlobReader(blobData), function(zipReader){
        zipReader.getEntries(function(entries){

                entries[1].getData(new zip.TextWriter(), function(text){
                        console.log(text);

                        this.Emit("dataReady", {
                            data : text});
                });
        }.bind(this));
    }.bind(this),this.onerror);
}.bind(this);

 xhr.open("GET","path/to/url/file.zip",true);
 xhr.setRequestHeader("Content-type","application/zip");
 xhr.responseType = 'blob';    
 xhr.send();

The error I am getting is:

File format is not recognized.

Please advice as I am using zip.js and reading a zip file response from an http request for the first time.Thanks!


Solution

  • Can you verify that you are using the correct this at this line

    this.Emit("dataReady", { data : text});
    

    I am not sure to where you are emitting the text but you may be calling Emit on the wrong object. If this is the case then please take a look at this link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call and do something like to quickly test. Note, I notice that you are already binding "this"

    var xhr = new XMLHttpRequest();
    var _root = this;
    xhr.onload = function(e) {
        var blobData = new Blob([this.response],{type : "application/zip"});
        zip.createReader(new zip.BlobReader(blobData), function(zipReader){
            zipReader.getEntries(function(entries){
    
                    entries[1].getData(new zip.TextWriter(), function(text){
                            console.log(text);
    
                            _root.Emit("dataReady", {
                                data : text});
                    });
            }.bind(this));
        }.bind(this),this.onerror);
    }.bind(this);