首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JQuery $.get和膨胀数据

JQuery $.get和膨胀数据
EN

Stack Overflow用户
提问于 2018-04-17 01:51:26
回答 1查看 228关注 0票数 0

我被交给了一个小的浏览器应用程序,它获取一个二进制文件,解压它,然后在浏览器中显示它的内容。

然而,我无法将数据正确地转换为字节数组,随后膨胀失败,并显示“设置的无效代码长度”。

这是我的get方法:

$.get("metafile.hsm", function (metaFile) {
    readCellFile(metaFile);
});

下面是使文件膨胀的方法:

  function readCellFile(file) {
    var reader = new FileReader(); 
    //      var file = document.getElementById('cell_file_input').files[0];
    reader.onload = function() { 
      var compressedData = new Uint8Array(reader.result);
      var data        = pako.inflate(compressedData); // Error "Invalid code length set"
      var buf = new flatbuffers.ByteBuffer(data);
      var cell = hdm.storage.hsg.Cell.getRootAsCell(buf);
      var features = parseCell(cell);
      // ...

    }

    reader.onerror = function(event) {
      console.error("File could not be read! Code " + event.target.error.code);
    };

    var blob = new Blob([file], {type: "application/octet-stream"});
    reader.readAsArrayBuffer(blob);
  }

我的转换是不是做错了?我可以排除文件被破坏的可能性,正如您在注释掉的行中看到的那样,我正在测试上传文件,并且它工作了。

EN

回答 1

Stack Overflow用户

发布于 2018-06-10 04:01:18

首先,你应该检查一下Javascript中的goal对于你的目标是否真的是必要的。如果服务器配置为支持even文件,并且浏览器支持even,那么文件(即使是通过javascript请求的文件)也应该自动压缩。

如果您需要使用此方法(例如,因为您无法控制服务器),那么从web worker中获取文件并在那里执行解压缩可能更好。下面的代码(使用gzipped文本文件在chrome上进行了测试)假定您的pako_inflate.min.js与主脚本和worker位于同一目录中。还要注意,如果在本地测试,出于安全原因,您的浏览器可能会阻止从本地文件加载web worker。

只需调用loadFile,传递要加载的文件的名称即可。完成加载后,将使用数据调用onFileLoaded。

fileLoader.js

/*
* If you are running this locally your browser may block you from 
* loading web worker from a local file. For testing you may want to run 
* a simple local web server like so: 'python -m http.server 8000'
*/
var gzippedFileLoaderWorker = new Worker("gzippedFileLoaderWorker.js");

gzippedFileLoaderWorker.onmessage = function (event) {
    var message = event.data;
    if (message.type == "START") {  
        console.log(message.data);
    } else if (message.type == "END") {
        onFileLoaded(message.data);         
    } else if (message.type == "ERROR") { 
        console.log(message.data); 
    }
};

function loadFile(fileName) {
    gzippedFileLoaderWorker.postMessage({ 
        type: 'loadFile', 
        fileName: fileName 
    }); 
}

function onFileLoaded(uncompressedFileData) {
    console.log("Data Loaded:" + uncompressedFileData);
}

gzippedFileLoaderWorker.js

importScripts('pako_inflate.min.js');

onmessage = function(event) {
  var message = event.data;
  if (message.type === "loadFile") {
    postMessage({ 
        'type' : 'START', 
        'data' : "Started Downloading: " + message.fileName 
    });
    try {
        /* 
        * Fetch is not supported on ie yet. If this is a requirement 
        * find a polyfill like whatwg-fetch 
        */
        fetch(message.fileName).then(function(response) {
            if (!response["ok"]) { 
                postMessage({ 
                    'type' : 'ERROR', 
                    'data' : "Error loading: " + message.fileName 
               })       
            }
            return response["arrayBuffer"](); 
        }).then(function(zipped) { 
            return pako.ungzip(new Uint8Array(zipped));
        }).then(function(binary) { 
            /* 
            *  Do any processing on the binary data here so you don't
            *  block the main thread! Then pass that data back as an
            *  object instead of the binary in the post message
            */
            postMessage({ 
                'type' : 'END', 
                'data' : binary 
            });
        }); 
    } catch(err) {
        postMessage({ 
            'type' : 'ERROR', 
            'data' : err.message 
        });
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49863433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档