Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 逐块下载客户端文件_Html_Blob_Webrtc_Fileapi_Chunking - Fatal编程技术网

Html 逐块下载客户端文件

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

我使用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);
}
//发送者
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