通过块下载文件客户端块

时间:2014-05-16 18:21:15

标签: html5 blob webrtc fileapi chunking

我正在使用WebRTC将文件发送到连接的对等方,而我正在以块的形式发送文件。但是,我无法弄清楚如何让对等方保存/下载文件,因为它正在流式传输,块大块。

我在网上找到的所有例子都建议做这样的事情:

// sender
dataConnection.send({
   'file': file
});

// receiver
dataConnection.on('data', function(fileData) {

    var dataView = new Uint8Array(fileData);
    var dataBlob = new Blob([dataView]);
    var url = window.URL.createObjectURL(dataBlob);

    // create <a>
    var link = document.createElement('a');
    link.href = url;
    link.download = fileName;
    document.body.appendChild(link);

    // trigger the download file dialog
    link.click();
}

然而,这种方法不支持获取文件的块并写入每个块...它必须等待发送方读取整个文件并发送给接收方。

我想做的是这样的事情:

// sender
for (var i = 0; i < fileSize; i += chunkSize) {

    var fileReader = new FileReader();

    // read next chunk
    var blob = file.slice(start, end);
    ...
    fileReader.onload = function(e) {
        ...
        dataConnection.send({ 'blob': blob });
    }
    fileReader.readAsArrayBuffer(blob);
}

这样,我正在按块读取文件块,并在读取时将每个块发送到接收器。现在,我知道如何实际保存以这种方式发送的文件的唯一方法是执行此博客文章中描述的内容:

http://bloggeek.me/send-file-webrtc-data-api

...在“步骤6:下载到常规FS”中描述。但是,这种方法在它们进入时占用所有块,将它们存储在内存中,然后在内存中构建一个大的UInt8Array,然后让接收器下载文件。这在内存上非常沉重,实际上可能只有几百MB,因此无法扩展。

有没有办法在第一个块进入后打开文件下载对话框,并在进入时继续编写块,以便下载是“流式”下载?

1 个答案:

答案 0 :(得分:1)

<强>更新

Streams API:https://streams.spec.whatwg.org

https://jakearchibald.com/2016/streams-ftw


不幸的是,根据我所研究的内容,无法打开文件保存/文件下载对话框并在&#34;流媒体&#34;中保存/下载文件。方式。

我将采用的方法是使用FileSystem API。不幸的是,并不是每个浏览器都完全支持:

...并且似乎很多浏览器都不会采用此API :(