How to share files using WebRTC Data Channel (RTP/SCTP) APIs?
HOME © Muaz Khan . @WebRTCWeb . Github . Latest issues . What's New?
This tutorial is out-dated (written in 2013). Please check this tutorial instead: https://codelabs.developers.google.com/codelabs/webrtc-web/#0
Getting started — You'll
- Get access to file using input—type=file
- Read file as Data-URL using FileReader API
- Define chunk length i.e. 1000 chars — to make sure it should work on chrome
- Get first chunk accordingly; transmit and continue...
First step: Getting access to file using INPUT-File element
document.querySelector('input[type=file]').onchange = function() {
var file = this.files[0];
};
Second step: Reading file as Data-URL using FileReader API
var reader = new window.FileReader(); reader.readAsDataURL(file); reader.onload = onReadAsDataURL;
Third step: Defining chunk length
var chunkLength = 1000;
Fourth step: Getting chunk and transmitting...
function onReadAsDataURL(event, text) {
var data = {}; // data object to transmit over data channel
if (event) text = event.target.result; // on first invocation
if (text.length > chunkLength) {
data.message = text.slice(0, chunkLength); // getting chunk using predefined chunk length
} else {
data.message = text;
data.last = true;
}
dataChannel.send(data); // use JSON.stringify for chrome!
var remainingDataURL = text.slice(data.message.length);
if (remainingDataURL.length) setTimeout(function () {
onReadAsDataURL(null, remainingDataURL); // continue transmitting
}, 500)
}
Fifth step: Receive chunks; store in array and...
var arrayToStoreChunks = [];
dataChannel.onmessage = function (event) {
var data = JSON.parse(event.data);
arrayToStoreChunks.push(data.message); // pushing chunks in array
if (data.last) {
saveToDisk(arrayToStoreChunks.join(''), 'fake fileName');
arrayToStoreChunks = []; // resetting array
}
};
Sending/Receiving files using Firefox
document.querySelector('input[type=file]').onchange = function () {
var file = this.files[0];
dataChannel.send(file);
};
dataChannel.onmessage = function (event) {
var blob = event.data; // Firefox allows us send blobs directly
var reader = new window.FileReader();
reader.readAsDataURL(blob);
reader.onload = function (event) {
var fileDataURL = event.target.result; // it is Data URL...can be saved to disk
SaveToDisk(fileDataURL, 'fake fileName');
};
};
SaveToDisk function — old syntax
function saveToDisk(fileUrl, fileName) {
var save = document.createElement('a');
save.href = fileUrl;
save.target = '_blank';
save.download = fileName || fileUrl;
var evt = document.createEvent('MouseEvents');
evt.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
save.dispatchEvent(evt);
(window.URL || window.webkitURL).revokeObjectURL(save.href);
}
SaveToDisk function — new syntax
function saveToDisk(fileUrl, fileName) {
var save = document.createElement('a');
save.href = fileUrl;
save.target = '_blank';
save.download = fileName || fileUrl;
var event = document.createEvent('Event');
event.initEvent('click', true, true);
save.dispatchEvent(event);
(window.URL || window.webkitURL).revokeObjectURL(save.href);
}
Links
- Share files using File.js
- Share Files / Demo
- RTCDataChannel APIs for Beginners
- RTCMultiConnection.js — A library for everything!