2016-09-21 146 views
0

使用FileReader.readAsArrayBuffer()我從二進制文件中讀取了一些內容,並得到了一個ArrayBuffer。Javascript,從ArrayBuffer到RAW二進制數據:如何?

現在我必須使用JQuery $ .ajax發送RAW二進制讀取。

FileReader.readAsBinaryString()函數已棄用,因爲標記爲非標準。我嘗試了這裏也提出的不同解決方案,但由於二進制 - > UTF轉換而改變了數據。

除了循環訪問數組,並將每個字節添加到要發送的字符串之外,任何提示都強烈推薦使用。

感謝您的幫助! :-)

+0

爲什麼你需要發送原始二進制文件?如果你能夠使用FileReader,你已經有了blob,只需發送它。如果你真的想讀二進制文件,那麼你可以使用'XHR.open('get',URL.createObjectURL(blob))' – Kaiido

+0

1.發送一個1Mb的大文件塊(> 1Gb)而不用修改php。 ini限制在哪裏是不可能的; 2.在文件xfer失敗的情況下使用resume執行文件上傳; 3.引入每個塊的文件校驗和,並在出現錯誤時及時恢復。 簡而言之,我的網絡應用程序集成了一些功能,即每個文件上傳器無需外部庫就可以集成這些功能,因爲我必須在上傳文件後對其進行一些修復。 –

+1

好的,將這些信息包含在您的問題的編輯中會很好。對於1,您只能發送大Blob塊(比較'blob.slice()'),然後[合併它們在服務器端](http://stackoverflow.com/questions/36045690/merging-file-chunks -in-PHP)。對於2.以上也將工作。對於3.不知道如何實現它,但讀取和解析正面的1GB文件聽起來像是一個不好的主意IMM。 – Kaiido

回答

0

您是否試過FileReader.readAsText方法?它允許指定編碼,但默認使用UTF-8。

https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsText

編輯

要發送的jQuery文件,你並不需要先讀。你可以簡單地使用FormData對象發送它。

請參閱How can I upload files asynchronously?

+0

UTF-8更改數據!它應該是二進制安全的! –

+0

UTF-8不會更改數據。給定編碼中的字符串只是二進制流的表示。如果使用FileReader讀取的文件包含文本,則需要知道其編碼才能將其正確轉換爲字符串。你用ASCII碼試過了嗎? –

+0

再次測試:原始文件是170'040字節的PNG,但FileReader.readAsText返回字符串長度爲306'478 ... 請解釋您引用「ASCII」的原因,因爲它不是有效的編碼。 –

0

只是覺得愚蠢的使用FileReader ...在所有。您不必閱讀文件內容即可發送。

var blob = new Blob(['abcdef']) // simulate a file 
var chunkSize = 2 // bytes to upload in each request 
var chunks = [] // result will be 3 chunks [ab, cd, ef] 
var offset = 0 // byte offset 

// build the chunk array 
do { 
    chunks.push(blob.slice(offset, offset + chunkSize)) 
    offset += chunkSize 
} while (offset <= blob.size) 

// upload the chunk one at the time 
chunks.reduce((uploaded, nextChunk) => 
    uploaded_chunk.then(() => 
     fetch('/upload', { 
      method: 'post', 
      body: nextChunk 
     }) 
}, Promise.resolve()).then(() => { 
    // all chunks has been uploaded in sequential order 
}) 

你可能不希望使用jQuery AJAX要麼因爲它需要你使用.ajax(不.post),你需要設置processData & contentTypefalse

看這個怎麼用jQuery發送一個blob:How can javascript upload a blob?

fetch是IMO更好,然後jQuery的ajax和內置到瀏覽器。只是有時需要一個polyfill


編輯:,這樣你就不必做這一切黑客上傳較大的文件最好是,如果你可以改變php.init允許更大上傳

+0

我必須將文件內容讀取到: - 監視並反饋文件上傳的進度; - 發送並對每個發送的塊進行校驗和; - 發生錯誤時重新發送塊; - 在服務器上,我可能無法訪問php.ini,而且我不希望在發送8Gb文件後發現上傳失敗。 因此我無法使用建議的解決方案。 –

+0

@FrancescoPiraneoG。,這裏唯一缺少的是進度處理,對於這個功能你需要XHR。但剩下的答案保持不變。如果發生錯誤,要重新發送,使用'fetch'只需使用'.catch'併爲XHR'onerror'使用。 – Kaiido

+0

yikes ...我會推薦[WebTorrent](https://webtorrent.io/)在這裏+一些混合服務器端洪流客戶端,將執行校驗,暫停,恢復等...或者所有NodeJS風格的流和管道然後還聽進展事件反正......也許:https://github.com/23/resumable.js是你的東西? – Endless

0

首先,讀爲ArrayBuffer:這似乎是最靈活的解決方案:

var reader = new FileReader(); 
reader.readAsArrayBuffer(blob); 

...和回調轉換爲BLOB:

$(reader).on("loadend", function(evt) { 
     if (evt.target.readyState === FileReader.DONE) { // DONE == 2 
      blob = new Blob([evt.target.result]); 
     } 
    }); 

最後一個形式發送:

var fd = new FormData(); 
    fd.append('xferID', xferID); 
    fd.append('data', blob); 

    $.ajax({ 
     url: 'http://......', 
     data: fd, 
     processData: false, 
     contentType: false, 
     type: "POST", 

     success: function(resultJSON) {...}, 
     error: function(resultJSON) {...} 
    } 

這顯然只是一個大綱;在PHP方面,您將收到$ _FILES超全局上的BLOB數據。

希望得到這個幫助。 :-)