2016-02-12 7 views
2

У меня есть большая капля для файла rar. Чтобы распаковать его, мне пришлось использовать эту библиотеку. unrar.jsКак объединить два буфера массива в один?

Блаб, с которым я тестирую, составляет около 23 МБ, чтобы прочитатьAsArrayBuffer, а затем передать его unrar.js. Мне пришлось нарезать его.

По какой-то причине unrar.js не очень хорошо работает с нарезанными блоками - это приведет к ошибке неизвестного типа архива, если диапазон разрезанных блоков не начинается с 0 или заканчивается blob.size. -wird? -

Единственным обходным решением, которое я могу придумать, является чтение блоба в виде срезов, а затем его обратно обратно в функцию onloadend. - Это возможно? -

Соберите буферы массивов в одном массиве, затем подайте его на unrar.js, чтобы распаковать файл, как если бы он был прочитан из одного блоба.

Если этот звук слишком раздражает для вас, я был бы признателен за любой другой способ прочитать файлы rar в среде javascript/phonegap.

ответ

3

Я не уверен, я полностью понимаю, почему блоб сегментирован, но если они есть, вы, вероятно, сделать что-то вроде:

var blobs = [new Blob(['Hello ']),new Blob(['World'])]; 
 
var buffers = []; 
 
var buffersFilled = 0; 
 

 
for(var i=0; i < blobs.length; i++) { 
 
    buffers.push(new Uint8Array()); 
 
} 
 

 

 
for(var i=0; i<blobs.length; i++) { 
 
    var fileReader = new FileReader(); 
 
    
 
    fileReader.onload = (function(i,fileReader) { 
 
     return function(){ 
 
     buffers[i] = fileReader.result; 
 
     isBuffersDone(); 
 
     } 
 
    })(i,fileReader); 
 
    fileReader.readAsArrayBuffer(blobs[i]); 
 
} 
 

 
function isBuffersDone() { 
 
    buffersFilled++; 
 
    if(buffersFilled >= blobs.length) { 
 
    var result = spliceBuffers(); 
 
    
 
    //***************** 
 
    // result is the spliced together buffers that could be given to unrar.js 
 
    console.log(result); 
 
    } 
 
} 
 

 
function spliceBuffers() { 
 
    var tmpResult = new Uint8Array(); 
 
    
 
    for(var i=0; i < buffers.length; i++) { 
 
    tmpResult = appendBuffer(tmpResult, buffers[i]); 
 
    } 
 
    
 
    return tmpResult; 
 
} 
 

 

 

 

 
function appendBuffer(buffer1, buffer2) { 
 
    var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength); 
 
    tmp.set(new Uint8Array(buffer1), 0); 
 
    tmp.set(new Uint8Array(buffer2), buffer1.byteLength); 
 
    return tmp; 
 
};

Хотя вышеуказанные работы, возьмите его с собой зерно соли, потому что с моим ограниченным пониманием того, что вы делаете Я не знаю, что это best solution

+0

Это именно то, что я хочу делать. Придется немного упростить его. Один вопрос - это массивный буфер, например fileReader.result? – Zahema

+0

@ Зачет результат типа Uint8Array. Чтобы добраться до ArrayBuffer, например fileReader.result, вам нужно будет использовать result.buffer, это даст вам массив ArrayBuffer, если он указан, но Uint8Array. См. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array –