2013-02-28 5 views
2

Мне нужно отправить файл из одного клиентского браузера в другой, не сохраняя его на сервере (узел .js) Как я могу это сделать с помощью HTML5 и API файлов?Как отправить один файл из одного браузера клиента в другой, не сохраняя его на сервере (node.js) с помощью html5 и API файлов

На самом деле решение, реализованное:

Final solutionlooks так:

  1. На посеве клиента получить файл из ввода [тип = файл]

  2. массив Файл содержит ключ хранения файла объекта , Используйте метод slice/mozSlice для разделения его кусков, чтобы Object.slice вернул объект Blob.

  3. Использование FileReader Blob можно считывать в необработанные двоичные данные или кодированные в base64 данные. FileReader реализует readAsDataURL (blob) для чтения в base64 и readAsBinaryString (blob) для чтения исходных двоичных данных. Смотрите «onloadend» событие FileReader, чтобы получить доступ к данным, считываемым из blob.

  4. Вы должны реализовать логику, чтобы вычислить количество порций в зависимости от размера порции (обычно 1024 * 64) и начала следующего среза/стоп позиции, чтобы получить куски точно такого же размера

  5. закодированные данные передаются через Socket.io на node.js, где единственной логикой на стороне сервера является отправка принятых данных на грушу, также подключенных через socket.io

  6. Угадайте, что самое интересное - собрать все эти куски в 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; 
    } 
    

После декодированные данные BLOb мы должны толкать его в массив, содержащий aother декодируется куски. 7. Создать Blob из массива кусков раскодируются в сгустки, как этот-л

new Blob (array_of_decoded_blobs_returned_by_decode64_function, {type:'mime-type'}) 

Использование файла апи записи блоб в файл или делать то, что вы хотите сделать

+0

Только что нашел это, вы можете прочитать его. http://googleblog.blogspot.sg/2013/02/race-to-win-on-big-and-small-screens.html –

+0

Это супер вопрос с решением! Я искал долго и упорно что-то вроде этого. Удалось ли вам перенести его равноправным путем без какого-либо реле? Интересно, есть ли вероятность получить копию кода, который вы написали? (Если он не чувствителен?) Это будет огромная помощь –

+0

, а также в 5 вы по-прежнему отправляете данные на сервер, вместо этого напрямую к другому партнеру, потребляющему (потенциально тонну) полосе пропускания. Как вы обошли это? спасибо –

ответ

2

WebSockets единственный способ, которым я могу себе представить, делая это, и вам все равно нужен серверный прокси.

См: Do websockets allow for p2p (browser to browser) communication?

+0

Thanx за вашу помощь.Что касается ссылки, которую вы указали, нет реальной рабочей реализации для груши, чтобы груша с веб-разъемами или любой другой спецификацией. Они предлагают использовать сервер для обработки соединений от разных клиентов, хотя я понятия не имею, как передать файл с двумя клиентами, подключенными через websocket, без необходимости его сохранения на стороне сервера. Поэтому мне нужна дополнительная помощь. – antiplayer

+0

Возможно, вам не нужно СОХРАНИТЬ это на сервере, но вы можете пропустить через него. –

+0

Любые идеи по потоковой технике с js? Я не мог найти способ загрузить файл в поток или smth, как это – antiplayer

1

Заканчивать webrtc. Вы можете напрямую отправить файл в браузер. Сервер сообщает только одному браузеру клиента о «адресе» другого клиентского браузера.