簡體   English   中英

Webrtc數據通道:大文件傳輸期間將數據保存在文件中

[英]Webrtc datachannels: saving data in file during transfer of big files

我正在使用WebRTC數據通道來構建文件傳輸服務。

對於小於30 Mb的較小文件,它運行得很好。 現在在接收端,我只是將文件數據保存在內存中,當所有數據傳輸完畢后,我將保存文件。

有點像這樣:

//On the recieving side
var dataArray = [];
var dcOnMessage= function(event){
    dataArray .push(event.data);
    if(bytesToRecieve == 0)
    {
        var blob = new Blob(dataArray ,{type: incFileDesc.type});
        reader.onload = function (event) {
            saveToDisk(event.target.result,incFileDesc.name);
        }
        reader.readAsDataURL(blob);
    }
}

var saveToDisk = function(fileUrl, fileName) {
        var save = document.createElement('a');
        save.href = fileUrl;
        save.target = '_blank';
        save.download = fileName || fileUrl;
        var event = document.createEvent('Event');
        event.initEvent('click', true, true);

        save.dispatchEvent(event);
        (window.URL || window.webkitURL).revokeObjectURL(save.href);
    }

因此,我想將數據保存在磁盤上的文件中,然后直接寫入該文件。 但是我該怎么做呢?

由於缺乏將數據追加到Blob的方法(請參閱從未在所有瀏覽器中實現的BlobBuilder API),當前的操作是最好的方法。 一旦Chrome瀏覽器(如Mozilla已經支持)支持通過datachannel發送Blob,這種情況可能會改變。

文件傳輸示例適用於高達1 GB的文件。

我不認為可以出於安全原因將文件保存在磁盤上,但可以將其作為BLOB保存到indexedDB中。 現在,IndexedDB得到了廣泛的支持(請參閱http://caniuse.com/#search=indexeddb ),並且適合於本地大型對象存儲。 有關API的更多詳細信息,請參見https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API 以下是在索引數據庫中保存BLOB的示例: https ://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/

恐怕當前的標准化API不會輕易允許這樣做(請參閱Philipp的回復)。 最接近的是將每個另存為blob / etc,保存在localstorage / indexeddb中,然后使用Blob構造函數從該blob集中構建最終文件。 它將仍然有大約2倍文件大小的臨時內存命中。 或者只是抓住內存中的每個Blob,直到構建最終的Blob並將其保存到磁盤為止(仍然是內存命中率,但是逐步構建,直到構建最終的Blob達到2倍時為止)。 當最終文件的大小在可用RAM的大小范圍內時,這些可能開始出現問題。

如今,在不使用SCTP ndata支持(尚不可用)的情況下,使用已棄用的低級分塊機制,可以在Firefox-> Firefox中直接傳輸單個大Blob; 它避免了內存不足的2倍。

我上次檢查了一下,Chrome中有一個非標准的API,該API通常可以執行附加到文件的部分。 這是WebAPI人士一直在討論的領域。 現在可能是再次戳他們的時候了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM