Html 逐块下载客户端文件
我使用WebRTC将文件发送到连接的对等方,并将文件分块发送。然而,我很难弄清楚如何让对等方在文件流式传输时逐块保存/下载文件 我在网上找到的所有例子都推荐这样做:Html 逐块下载客户端文件,html,blob,webrtc,fileapi,chunking,Html,Blob,Webrtc,Fileapi,Chunking,我使用WebRTC将文件发送到连接的对等方,并将文件分块发送。然而,我很难弄清楚如何让对等方在文件流式传输时逐块保存/下载文件 我在网上找到的所有例子都推荐这样做: // sender dataConnection.send({ 'file': file }); // receiver dataConnection.on('data', function(fileData) { var dataView = new Uint8Array(fileData); var d
// 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);
}
//发送者
dataConnection.send({
“文件”:文件
});
//接受者
dataConnection.on('data',函数(fileData){
var dataView=新的Uint8Array(fileData);
var-dataBlob=新Blob([dataView]);
var url=window.url.createObjectURL(dataBlob);
//创造
“第6步:下载到常规FS”中所述”。然而,这种方法将所有的数据块都存储在内存中,然后在内存中构建一个大的UInt8Array
,然后让接收者下载文件。这确实占用了大量内存,实际上可能限制为几百MB,因此无法扩展
有没有办法在第一个区块进入后打开文件下载对话框,并在区块进入时继续写入,以便下载是“流式”下载?更新
Streams API:
不幸的是,根据我的研究,没有办法打开文件保存/文件下载对话框,以“流”的方式保存/下载文件
我将采用的方法是使用。不幸的是,并非每个浏览器都完全支持这一点:
…而且许多浏览器似乎不太可能采用此API:(
-
关于本文件的工作已经停止,不应停止
被引用或用作实施的基础
我认为这是不可能的,至少在普通javascript中是不可能的,因为创建blob后无法写入它。但是,您可以将它存储在文件系统中,但只有chrome支持它,并且自一个月以来,规范就被弃用了,因为没有其他浏览器对其进行了修改。这应该可以防止内存溢出,但您需要知道在创建存储之前发送的总文件的大小。我只在Chrome上使用WebRTC,这样就可以了。你能举一个例子说明localstorage
如何工作,或者链接到一些示例吗?@MarijnS95“因为创建blob后无法写入它”可以使用Blob.prototype.slice()
@guest271314写入Blob
,或者使用现有Blob
的字节创建一个新的Blob
(新的Blob([blobA,blobB,blobC])
,这确实可以创建一个Blob
,它是其他Blob
的串联,你甚至不需要.slice()
(当然,除非你的意思是在发送方使用该函数)。但是,这并不能回答问题;询问者正在寻找一种方法,在数据块进入时将其保存到磁盘,而不是将其累积到某个地方(例如,这些Blob
“技巧”)在通过webbrowser下载整个文件之前(不过,使用Blob
s可能比使用UInt8Array
要好)。@MarijnS95