逐块下载客户端文件



我正在使用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,所以它无法扩展。

是否有办法打开文件下载对话框后的第一个块进来,并继续写块,因为他们进来,使下载是一个"流"下载?

UPDATE

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

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


不幸的是,根据我的研究,没有办法打开文件保存/文件下载对话框,并以"流"的方式保存/下载文件。

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

  • = http://caniuse.com/壮举文件

…而且似乎不太可能有很多浏览器会采用这个API:(

    http://www.w3.org/TR/file-system-api/
  • 本文档的工作已经停止,它不应该停止引用或用作实现的基础

最新更新