2016-02-12 96 views
2

我有一個rar文件的大塊。要解壓縮它,我必須使用這個庫unrar.js如何將兩個數組緩衝區合併爲一個?

我測試的blob大概是23MB,要讀取asArrayBuffer然後將其提供給unrar.js我必須將其切片。

由於某些原因,unrar.js與切片blob不能很好地協作 - 如果切片blob範圍不以0開頭或以blob.size結束,它會拋出未知的歸檔類型錯誤。 - 奇怪? -

我能想到的唯一解決方法是將塊讀爲片,然後在onloadend函數中再次收集它。 - 甚至有可能嗎? -

將陣列緩衝區收集到一個陣列中然後將其饋送到unrar.js以解壓縮文件,就好像它是從一個blob讀取的一樣。

如果這聽起來太煩人,我會很感激任何其他方式來閱讀JavaScript /手機環境中的RAR文件。

回答

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

雖然上述作品,與把它一粒鹽,因爲我對自己在做的事情有限的理解,我不知道這是最好解決方案

+0

這正是我想要做的。將不得不簡化一點。一個問題的結果是像fileReader.result數組緩衝區? – Zahema

+0

@Zahema結果是Uint8Array類型。爲了得到一個類似於fileReader.result的ArrayBuffer,你將需要使用result.buffer,這將爲你提供如果被引用但是Uint8Array的ArrayBuffer。請參閱:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array –

相關問題