Я использую 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: Загрузка в обычную ФС». Однако этот подход берет все фрагменты по мере их поступления, сохраняет их в памяти, затем создает большой UInt8Array
в памяти, а затем позволяет получателю загрузить файл. Это очень много памяти и реально ограничено парой сотен МБ, поэтому не масштабируется.
Есть ли способ открыть диалоговое окно загрузки файла после поступления первого фрагмента и продолжать записывать фрагменты по мере их поступления, чтобы загрузка была потоковой?
localstorage
будет работать, или ссылку на несколько примеров? - person Hristo   schedule 16.05.2014Blob
или, точнее, создать новыйBlob
, используя байты из существующегоBlob
, используяBlob.prototype.slice()
- person guest271314   schedule 25.09.2016Blob
, который представляет собой конкатенацию другихBlob
(new Blob([blobA, blobB, blobC])
), вам даже не нужно.slice()
для этого (если, конечно, вы не имели в виду использование этой функции на стороне отправителя). Однако это не отвечает на вопрос; запрашивающий ищет способ сохранить фрагменты на диск по мере их поступления, вместо того, чтобы где-то их накапливать (например, этиBlob
'уловки') перед загрузкой всего файла через веб-браузер (используя ХотяBlob
s, вероятно, лучше, чемUInt8Array
). - person MarijnS95   schedule 25.09.2016