Мне нужно отправить файл из одного клиентского браузера в другой, не сохраняя его на сервере (node.js). Как мне это сделать с помощью HTML5 и File API?
Собственно реализовано решение:
Окончательное решение выглядит так:
При раздаче клиент получает файл из input[type=file]
Файловый массив содержит ключ, хранящий файловый объект. Используйте метод slice/mozSlice, чтобы разделить его на части, чтобы Object.slice возвращал объект Blob.
С помощью FileReader Blob можно считывать в необработанные двоичные данные или данные в кодировке base64. FileReader реализует readAsDataURL(blob) для чтения в base64 и readAsBinaryString(blob) для чтения в необработанные двоичные данные. См. событие FileReader onloadend, чтобы получить доступ к данным, считанным из большого двоичного объекта.
Вы должны реализовать логику для вычисления количества фрагментов в соответствии с размером фрагмента (обычно 1024 * 64) и начальной/конечной позицией следующего фрагмента, чтобы получить фрагменты точно такого же размера.
Закодированные данные отправляются через socket.io на node.js, где единственная логика на стороне сервера заключается в отправке полученных данных на грушу, также подключенную через socket.io.
Думаю, самое интересное - собрать все эти фрагменты вместе в большой двоичный объект в клиентском браузере Pear. Создание BLOB-объекта из необработанных двоичных данных приведет к неправильному размеру BLOB-объекта и, как следствие, к неправильному размеру файла. Вот почему мы передаем из сеялки данные в кодировке base64.
Декодирование может стать проблемой, поскольку мы должны реализовать его самостоятельно.function decode64 (data) { var mimeString = data.split(',')[0].split(':')[1].split(';')[0], // remove all chars before ',' byteString = atob(data.split(',')[1]), // if BlobBuilder available ab = new ArrayBuffer(byteString.length), ia = new Uint8Array(ab); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } blob = new Blob([ia], {'type' : (mimeString) }); return blob; }
После декодирования данных в блоб мы должны поместить их в массив, содержащий другие декодированные фрагменты. 7. Создайте BLOB-объект из массива фрагментов, декодированных в BLOB-объекты, что-то вроде этого
new Blob (array_of_decoded_blobs_returned_by_decode64_function, {type:'mime-type'})
Используя файловый API, записывайте большие двоичные объекты в файл или делайте все, что хотите.