суббота, 26 ноября 2011 г.

Открытие файла на диске через сайт


Постановка задачи


Был разработан сайт-надстройка над файлохранилищем. В качестве дополнения к данному сайту я разрабатывал клиент под windows. Данный клиент должен был синхронизировать файлы на диске с репозиторием.

Одной из фишек сайта было моментальное открытие файла с диска ассоциированным приложением. О реализации данной фишки и пойдет речь в данной статье.


Решение задачи


Решением в лоб является любая реализация технологии COMET, но все они чреваты трудностями и затратами на сервер. Вдохновением для моего решение была одна неприятная особенность работы скайпа: если его установить до IIS, то скайп начинал слушать 80-ый порт. Соответственно схема работы получилось очень простой:
  • пользователь нажимает на кнопку на сайте
  • браузер делает http запрос к localhost
  • клиент, слушающий соответствующий порт, открывает файл


В клиенте добавляем любую реализацию http сервера и вешаем слушателя на какой-нибудь порт (в нашем случае 7000).

На странице добавляем небольшую функцию:

function doSomethingOnDisk(){
$.getJSON(
                "http://127.0.0.1:7000?jsoncallback=?",
                { command: commandname [, optional params] },
                function (data) {
                   //do something
                }
            );
}

Нужно быть внимательным, т.к. в данном случае происходит кроссдоменный ajax запрос. Поэтому не забываем про «jsoncallback=?» и обернуть ответ в клиенте в соответствующую обертку (придет в параметре jsoncallback).

Плюсы

  • Просто
  • Быстро
  • Никакого лишнего трафика

Минусы

  • Порт может быть занят или закрыт
  • Если есть брандмауер, то windows попросит разрешения для приложения и пользователь может отказать


П.С. как не трудно заметить, данная реализация позволяет давать с сайта любые команды клиенту.

jQuery.getJSON
http server для C#

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

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