0

我正在使用 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);
    }

所以我想将数据保存在磁盘上的文件中,然后直接写入该文件。但是我该怎么做呢?

4

3 回答 3

1

我认为您不能将文件保存在磁盘上(出于安全原因),但您可以将其作为 BLOB 保存到 indexedDB 中。IndexedDB 现在得到了广泛的支持(参见http://caniuse.com/#search=indexeddb),适用于本地大型对象存储。有关 API 的更多详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API。这是在 IndexedDB 中保存 BLOB 的示例:https ://hacks.mozilla.org/2012/02/storing-images-and-files-in-indexeddb/

于 2015-04-17T14:55:16.910 回答
1

由于缺乏将数据附加到 blob 的方法(请参阅从未在所有浏览器中实现的 BlobBuilder API),您所做的是目前最好的方法。一旦 Chrome(就像 Mozilla 已经做的那样)支持通过 datachannel 发送 blob,这种情况可能会改变。

文件传输示例适用于高达千兆字节的文件。

于 2015-04-17T14:50:47.873 回答
1

恐怕目前的标准化 API 不容易做到这一点(见 Philipp 的回应)。最接近的方法是将每个保存为 localstorage/indexeddb 中的 blob/etc,然后使用 Blob 构造函数从 blob 集中构建最终文件。它仍然会有大约 2 倍文件大小的临时内存命中。或者只保留内存中的每个 blob,直到构建最终 Blob 并保存到磁盘(仍然是内存命中,但逐渐直到构建最终 blob 时达到 2 倍)。当最终文件的大小在可用 RAM 的大小范围内时,这些可能会开始出现问题。

在 Firefox->Firefox 中直接传输单个大 Blob 现在可以在没有 SCTP ndata 支持(尚不可用)的情况下使用已弃用的低级分块机制;它避免了内存命中的 2x 部分。

Chrome 中有一个非标准的 API,它主要可以完成附加到文件的部分,最后我检查了一下。这一直是与 WebAPI 人员讨论的一个持续领域。可能是时候再次戳他们了。

于 2015-04-21T13:36:19.563 回答