Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2015-06-08

Upload files by chunks

Грузите апельсины бочками.

Есть у меня демка, загрузка файлов чанками на сервер. Суть в том, что раз чанками, то файлы могут быть любого размера, лишь бы место на диске было.
Вообще-то этих поделок у меня уже порядком накопилось, но тут я про одну конкретную расскажу:
HTML5 FileAPI + Node.js + Socket.io

Внезапно, понадобилось вывести аппликуху в люди. Одному хорошему человеку надо было дать возможность передать файл. Файл такого размера, что в электропочту не лезет. Всякие яндекс-диски и прочие дропбоксы этот человек, в силу почтенного возраста, понимать не хочет. Тут я и вспомнил про VCU.

Достал аппликуху с чердака, отряхнул от пыли, засадил за reverse proxy, отягощенный HTTPS и, какая неожиданность, ничего не работает.

Забегая вперед, скажу, что проблем была целая пачка: начиная с нежелания вебсокетов работать через https прокси и заканчивая некоторыми изменениями в реализации FileAPI в разных браузерах.

Проблема первая. Надо заставить вебсокеты работать позади https reverse proxy.
Прокси типа такого:
# /etc/apache2/sites-available/rover-ssl.conf
...
<Location /node/vcu/>
        Order allow,deny
        allow from all
        AuthType Basic
        AuthUserFile /home/valik/.htpasswd
        AuthName "Alwaysglum restricted services"
        Require valid-user
    ProxyPass http://localhost:8080/
</Location>
...

Код в app.js, который прекрасно работает в тепличных лабораторных условиях:
io = require('socket.io').listen(app)
требуется заменить на более изощренный:
io = require('socket.io').listen(app, {'transports': ['polling']})
Почему так и никак иначе, сами догадайтесь.

Теперь второй файл (вся аппликуха состоит из двух файлов), index.html.
Подключение скрипта, меняем вот это:
<script src="/socket.io/socket.io.js"></script>
на более другое:
<script src="socket.io/socket.io.js"></script>
Абсолютные пути для лохов.

И меняем код создания сокета с примитивного
var socket = io.connect();
на более специфичное:
var socket = io.connect(
    'https://alwaysgloom.sytes.net',
    {path: '/node/vcu/socket.io'});

Теперь вебсокеты работать будут.
Осталось решить проблемы совместимости FileAPI в разных браузера.

Если вкратце, то раньше чтение файла браузером с диска было
fileReader.readAsBinaryString(blob);
а стало
fileReader.readAsArrayBuffer(blob);

Что самое удивительное, на сервере в Node.js данные приходят в виде объекта Buffer в обоих случаях! Хотя, казалось бы, очевидно, что должен приходить ArrayBuffer, если клиент засылает ArrayBuffer. Я на этой очевидности потерял пару вечеров, пробуя разные варианты преобразований ArrayBuffer → Buffer.
В итоге, по неясной причине, серверный код править пришлось только в части вызова функций fs.write. Там тоже что-то поломалось.
Конечный вариант использования fs.write выглядит как-то так:
//fs.write(fd, buffer, offset, length[, position], callback)
fs.write(fObj.fHandle, fObj.bytesBuf, 0, fObj.bytesBuf.length, null,
 function(err, written, buffer) { ...

Полностью все тонкости можно рассмотреть тут





original post http://vasnake.blogspot.com/2015/06/upload-files-by-chunks.html

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)