繁体   English   中英

通过块下载文件客户端块

[英]download file client-side chunk by chunk

我正在使用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 不幸的是,每个浏览器都不完全支持这个:

...而且似乎很多浏览器都不会采用这种API :(

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM