Что такое webdav сервер. Яндекс Диск — подключение по протоколу WebDAV

04.04.2019

По сравнению с FTP протокол WebDAV обладает рядом преимуществ:

  • Выполнение основных файловых операций над объектами на удаленном сервере;
  • Выполнение расширенных файловых операций (блокировки, поддержка версий);
  • Работа с любым типом объектов (не только файлы);
  • Поддержка метаданных (свойств) объектов;
  • Поддержка одновременной работы над объектами.
  • Нет необходимости открывать дополнительные порты (работает поверх http).

Перед тем как начать необходимо , к содержимому которого и будем открывать доступ с помощью WebDAV.

Настройка IIS + WebDAV

В этом примере используется IIS 7.5, входящий в базовую поставку Windows 7.

Открываем Панель управления -> Программы -> Включение или отключение компонентов Windows. В списке раскрываем «Службы IIS» -> Службы Интернета -> Общие функции HTTP -> отмечаем компоненту «Публикация WebDAV»:

Далее открываем «Диспетчер служб IIS» (Пуск -> Правый клик по Компьютер -> в меню выбрать Управление -> Службы и приложения). Выбираем сайт, в моем случае это Default Web Site (веб-сайт по умолчанию). Переходим в раздел «Проверка подлинности». Здесь необходимо удостовериться, что включена компонента «Проверка подлинности Windows»:

Открываем раздел «Правила разработки WebDAV».

Добавляем новое правило разработки. Разрешить доступ — ко всему содержимому. Далее указываем группу пользователей, которой разрешен доступ. В моем случае это группа Администраторы. Внизу в разделе «разрешения», отмечаем все три опции (чтение, источник, запись), чтобы гарантировать полный доступ:

Последний этап — включаем WebDAV (в правой колонке ссылка «Включить WebDAV»):

На всякий случай перезапускаем IIS. На этом все. теперь пробуем подключиться.

Еще раз напоминаю, для работы WebDAV не надо открывать ни каких дополнительных портов, кроме, разумеется, TCP 80. Т.е. если есть доступ к сайту, то и WebDAV будет работать.

Подключение

Самый быстрый и простой способ: в командной строке выполнить

net use * http://ip_адрес_сайта/

Или через графический интерфейс. Откройте Пуск -> Компьютер -> Подключить сетевой диск. Введите адрес сервера (обязательно c http://) и нажмите Готово.

Введите имя пользователя и пароль:

После нажатия на Ок, откроется окно с содержимым удаленного сервера.

В статье рассмотрим протокол WebDAV, который позволяет работать с файлами на удалённых серверах хранения данных наподобие "Яндекс.Диск". В первую очередь это актуально для пользователей Linux, для которых подобные сервисы не всегда делают специальные клиенты. Но аргументы в пользу WebDAV могут быть интересны и пользователям других ОС.


Универсальный доступ к "облакам"

На прошлой неделе у меня прибавилось "облачных флешек". Дополнительно к Ubuntu One и Dropbox прислали свои инвайты и сервисы Google Drive и "Яндекс.Диск". Итого у меня уже четыре "облачных диска".

И ведь это ещё не предел. Подобные "облачные сервисы" становятся популярными, и есть ещё, например, SugarSync, Box и другие. С одной стороны такое разнообразие и выбор - всё это хорошо для конечного пользователя. Но, с другой стороны, возникают вопросы с работой с большим количеством подобных сервисов, когда их не один, а несколько штук.

Ведь каждый сервис старается выпустить собственный клиент для интеграции себя в систему пользователя. И когда таких "флэшек" много, то обилие подобных клиентов вряд ли это будет эстетично. А, например, для Linux, наоборот, специального клиента может быть вообще не предусмотрено.

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

И таким способом вполне может стать протокол WebDAV. Этот протокол позволяет работать с файлами на удалённом сервере и выполнять обычные действия с ними: чтение, запись, удаление.

Поддержка этого протокола имеется во многих операционных системах - Linux , Windows, Mac OS. Другое дело, что не все "облачные" сервисы предоставляют доступ посредством WebDAV. Но честь и хвала "Яндекс.Диску", который не только обеспечил поддержку, но и поощряет использование протокола WebDAV. Поэтому познакомимся с этим протоколом чуть ближе.


Что такое WebDAV

WebDAV (Web-based Distributed Authoring and Versioning) - расширение протокола HTTP , позволяющее не только загружать веб-странички в браузер, но и при помощи расширенного набора команд работать с файлами на удалённом сервере, и не только с файлами. То есть, WebDAV - это такая замена для протоколов FTP и SMB.

Протокол позволяет выполнять и расширенные типы операций - блокировку, поддержку версий, работу с метаданными объектов. А также возможна работа не только с файлами, но и другими объектами, - например, записями адресной книги.


WebDAV и Linux

Как было сказано выше, WebDAV в первую очередь актуален для пользователей Linux. И поддержка протокола WebDAV в Linux внедрена давно. Эта поддержка может осуществляться как на уровне отдельных файловых менеджеров, так и на более глубоком системном уровне при помощи специальных пакетов.

Для начала рассмотрим как подключить WebDAV-ресурс в стандартном файловом менеджере "Наутилус". Рассмотрим на примере подключения к "Яндекс.Диск".

Файловый менеджер GNOME имеет встроенную поддержку WebDAV, поэтому его пользователям ничего доустанавливать не нужно. Следует открыть окно "Файл - Подключиться к серверу" и здесь ввести следующие данные:

Сервер: webdav.yandex.ru
Тип: Безопасный WebDAV (HTTPS)
Имя пользователя: ваш логин на сервисе
Пароль: пароль к сервису

После чего "Наутилус" соединится с "облачной флэшкой" и создаст в боковой панели закладку вместе с другими разделами. Реально же смонтированные "Наутилусом" ресурсы находятся в каталоге ~/.gvfs.

Есть и более классический и универсальный способ монтирования "облачных флэшек" в систему.

Сначала устанавливаем пакет davfs2, предназначенный для работы с WebDAV:

Sudo apt-get install davfs2

Создаём в домашней директории каталог для монтирования "облачного диска", и для примера назовём этот каталог cloud:

$ mkdir /home/домашний_каталог/cloud

Утилита davfs2 имеет специальный файл конфигурации, в котором можно сохранить логин и пароль, чтобы их не вводить каждый раз при монтировании "облачного диска". Для этого записываем в файл /etc/davfs2/secrets специальную строку с вашим логином и паролем на сервисе Яндекс:

Https://webdav.yandex.ru:443 логин пароль

Https://webdav.yandex.ru:443 /home/домашний_каталог/cloud davfs uid=пользователь,file_mode=640,dir_mode=755,user,noauto 0 0

Потом заносим себя в группу davfs2:

$ sudo usermod -a -G davfs2 пользователь

Чтобы позволить запустить mount.davfs обычным пользователю выполним команду:

$ sudo chmod 4755 /usr/sbin/mount.davfs

Всё, теперь наш "облачный диск" на Яндексе можно монтировать простой командой:

$ mount /home/домашний_каталог/cloud

И размонтировать:

$ umount /home/домашний_каталог/cloud

Михаил АСТАПЧИК

Подробности root Новости 17 января 2011

WebDAV - защищённый сетевой протокол высокого уровня, работающий поверх HTTP для доступа к каталогам и файлам. Но в данном случае я не хотел бы обременять Вас терминами, а очень кратко показать принцип и методику работы WebDAV в ISPConfig 3. Проще говоря, я покажу как это запустить что бы это работало, для того что бы спросить у Вас зачем это вообще нужно?

Настройка WebDAV

Для начала я скажу Вам следующую картину. ISPConfig 3 установленная по материалу Идеальный сервер - Ubuntu 10.10 имеет особенность. Она состоит в том что при подключении к вашему сайта по FTP логин и пароль задаются именно те, которые вы указали в настройках. Оно и логично, но вот при установку чего либо через сайт вы получите совершенно другой результат. Файлы переписываются на другую группу и пользователя www-data и www-data. А это грозит тем что файлы и каталоги от другого владельца станут не доступны и запись и удаление. И тут я задумался, если доступ к файлам закрыт для FTP пользователя, то выход из такой ситуации будет в применении WebDAV .

Начнем с настройки нашей панели управления хостингом ISPConfig 3 перейдем в раздел сайты - пункт Webdav User.

Здесь мы может добавить доступ WebDAV для каждого сайта в отдельности. Для этого мы нажимаем на кнопку Добавить нового WebDAV пользователя :

В этой форме мы выбираем web сайт для которого надо открыть доступ по WebDAV протоколу, а так же логин и пароль для этого каталога. Сам каталог, а точнее его имя мы указываем в поле Директория .

По окончанию применим и сохраним наши настройки для WebDAV, нажав на кнопку сохранить. Настройка как видно из материала сведена на минимум, поэтому осложнений у Вас быть не должно.

Продолжая тему WebDAV протокола, я покажу как выглядит подключение по протоколу WebDAV в Windows 7. Я буду использовать только ресурсы самой операционной системы Windows 7 (домашняя расширенная).

Подключение к нашему серверу по WebDAV протоколу выглядит как подключение сетевого диска, поэтому я опишу самый простой и быстрый способ. Откроем Компьютер на рабочем столе или из Пуск (для примера Windows XP имеет иконку с названием Мой компьютер ). В открывшемся окне Компьютер мы должны подключить сетевой диск, если мне не изменяет память то начиная с Windows Vista дополнительные настройки по умолчанию скрыты, а для того что открыть эту панель необходимо в нашем открытом окне нажать клавишу Alt , которая раскроет эти дополнения, где мы выберем Сервис - Подключить сетевой диск... :

В своем случае для подключения подключение по протоколу WebDAV я указываю сетевое имя как адрес интернет страницы , да Вы не ошиблись именно с http:// Внимание я обращаю на тот факт что имя сайта указывается именно то которое вы создавали в панели управления хостингом ISPConfig 3, но в моем случае стоит редирект (материал WWW redirect), поэтому ссылка автоматически перенаправляет на http://www.. Вернемся к настройке при указании адреса нажмем кнопку Готова , Windows произведет подключение, если все удачно то система запросит логин и пароль, в моем тестовом подключении я использовал логин llirikkswww и пароль 123456. В результате мы получим подключенный ресурс доступ к которому мы получаем как к простому локальному диску.

Альтернатива подключения к WebDAV

Самой простой альтернативой является интернет браузер, я лично производил проверку на Internet Explorer, Mozilla Firefox, Google Chrome. Все как один подключались к серверу и запрашивали логин и пароль (Адрес сервера, логин и пароль остаются неизменными для любых подключений).

Думаю если вы уже проверили данный способ подключения то поняли, что такой вид можно считать не более чем альтернативой но не основным способом подключения из за отсутствия возможности загружать или изменять файлы находящиеся на сетевом ресурсе WebDAV, только просмотр и загрузка файлов.

Заключение о WebDAV в ISPConfig 3

Здесь я хотел бы услышать Ваше личное мнение о данном сервисе и физической ее реализации. Лично мое мнение: это может пригодится для коллективной работы на сайте например для отправки или коллективной работы с файлами. Как пример для фотоцентра для загрузки графических файлов. Для больших офисных решений для работы над одним проектом, например проект + смета + документация + коммерческие предложения.

Хотелось бы услышать Ваше мнение, на хрена такое кому-то вообще надо:)))

Обновлено: 16 сентября 2014 Просмотров: 9969

Так как именно протокол определяет то, как общаются между собой программы и сервер, от его выбора зависит примерно всё. И то, как будут устроены клиенты, и то, какие возможности работы с файлами у них будут.

Сегодня мы хотим рассказать о причинах, которые остановили наш выбор именно на WebDAV и сделали его протоколом для клиентов Яндекс.Диска .

Благодаря API , реализованному на его базе, с нашим сервисом уже работают ABBYY FineScanner , Handy Backup 7 , ES Проводник и .

Перед тем как выбрать протокол, мы определили для себя важнейшие требования к нему:

  1. Скорость работы;
  2. Открытая лицензия;
  3. Возможность реализации всех необходимых действий: аутентификации, поддержки файловых операций, конкурентного доступа к файлам, докачки с сервера и возобновления закачки на сервер;
  4. Распространённость - он должен работать с целевыми операционными системами (в первую очередь Windows, Mac OS X, Linux) «из коробки» или с минимальными доработками.
Мы даже были готовы разрабатывать свой собственный протокол, если бы существующие нам не подошли. Изменение протокола после запуска потребовало бы много человекочасов работы, поэтому нужно было изучить разные варианты и выбрать лучше всего отвечающий нашим требованиям.

FTP . Этот протокол для удалённой работы с файлами проверен временем. Но создавался он без учёта требований информационной безопасности, что стало для нас его существенным недостатком. Помимо этого, он не поддерживает многие необходимые нам операции, например, передачу метаданных вместе с содержимым файла. И требует для подключения специальные приложения.

BitTorrent . Так как речь сразу шла о синхронизации между девайсами, то использовать соединение между ними без создания нагрузки на серверы было бы очень полезно, но это потребовало бы двойной работы по разработке клиента. Вдобавок возникли бы проблемы при работе через NAT-ы и firewall-ы, что сильно снизило бы пользу от использования этого протокола.

Amazon S3 . Это хранилище использует свой собственный протокол, основанный на HTTP. Мы рассматривали возможность использования API S3, однако отказались от этой идеи из-за отсутствия в нём привычной работы с каталогами и из-за необходимости использовать специальные приложения для доступа.

WebDAV . Основанный на HTTP и XML и нетрудно расширяемый, он поддерживает в спецификациях практически все, что нам нужно. C ним достаточно хорошо работают предустановленные пакеты во всех целевых операционных системах. Кроме того отдел разработки десктопных клиентов Яндекс.Диска, занимавшийся XMPP-сервером Яндекса, на тот момент уже имел опыт работы с открытыми протоколами на базе XML.

Главной причиной, по которой нам не хотелось создавать свой собственный протокол, было то, что работать с ним смогут только наши приложения, а мы хотели открытости.

В итоге, из всех обсуждавшихся вариантов мы выбрали WebDAV. Единственное, чего не хватало в протоколе - это информирования клиента об изменениях на сервере, очень важной фичи синхронизации. Но так как протокол расширяем, это не стало проблемой.

После выбора протокола началась работа над прототипом Яндекс.Диска. Наш WebDAV-сервер мы написали на Erlang . В качестве фреймворка для веб-сервера был выбран mochiweb , достаточно легковесная и хорошо знакомая нашим разработчикам библиотека. Она же была использована в известной статье о подключении миллиона пользователей к одному серверу - A million user comet application . Также мы думали и об использовании веб-сервера Yaws , который можно сравнить с Apache. Это полноценный веб-сервер, умеющий отдавать статику, запускать CGI-скрипты, обрабатывать специальные страницы с серверными скриптами. Но это всё было нам не нужно. Если бы мы начинали делать проект сейчас, выбор пал бы на Cowboy , так как он предоставляет больше возможностей по определению проблем с соединением.

После изучения протокола WebDAV началась работа над операциями листинга файлов и каталогов на сервере. В качестве хранилища для прототипа использовались mysql-база данных, в которой хранилась мета-информация и обычная файловая система для хранения содержимого файлов. Масштабирования и высокой надёжности на этом этапе не требовалось.

Схема была довольно простой, так как это был прототип. Как обычно бывает с файловыми системами, встал вопрос ограничений на пути. Так как максимальная длина пути к ресурсу в протоколе не оговаривалась, было решено сделать длину компоненты пути в 255 символов, а количество уровней вложенности неограниченным. Примерно таблица хранилища файлов выглядела так:

Одной из первых нетривиальных задач стал листинг корня, в котором ничего нет. Сложность в том, что метод PROPFIND , кроме просто листинга, выполняет ещё и задачу чтения свойств ресурса. Необходимо было правильно разбирать запрос, понимать, что мы можем выдать, а что нет; формировать правильный ответ. В качестве первого клиента использовался встроенный в Ubuntu gvfs. Отладив работу с ним, мы решили проверить работу подключения из Windows 7 и обнаружили, что он с нами не работает. Исследование работы с другими серверами показало, что встроенные в Windows клиенты не обрабатывают пространство имён «DAV:», если оно объявлено дефолтным, без префикса. Другие стандартные клиенты оказались более терпимыми и легко переваривали выдачу, сформированную специально для клиентов Windows. К счастью, это была единственная несовместимость, которую нам удалось найти.

Когда работа над листингом была завершена, мы реализовали тривиальные операции создания каталогов и удаления ресусов.

Если бы в качестве введения я начал расписывать достоинства облачных хранилищ данных, ты бы подумал, что меня только что разморозили после двадцатилетнего анабиоза или что я серьезно злоупотребляю снотворными:). Поэтому скажу кратко, по-программистски: когда передо мной встала задача сделать программу, которая могла бы без привязки к API конкретного сервиса работать с файлами на множестве хранилищ (речь шла о бэкапе), оказалось, что это не так просто. Обо всех тонкостях и подводных камнях проделанной работы я решил тебе рассказать в этой статье.

WebDAV

WebDAV (Web Distributed Authoring and Versioning) - это протокол для передачи данных и работы с ними, построенный поверх HTTP 1.1. Здесь следует заметить, что передача может быть как защищенной, так и незащищенной. В самом протоколе защищенность отсутствует, но она может быть добавлена через реализацию аутентификации на веб-сервере и шифрование посредством SSL, следовательно, в таком случае будет использоваться не HTTP, а HTTPS.

Изначально DAV разрабатывался для совместного создания и редактирования веб-страниц, но в процессе использования он нашел применение в качестве сетевой распределенной файловой системы, эффективной для работы в высоконагруженной среде и поддерживающей неустойчивое соединение. Таким образом, DAV подходит для управления файлами на веб-серверах, иными словами, реализации облачных хранилищ информации, где и был применен. С его помощью можно выполнять основные операции над файлами, содержащимися на сервере, проводить расширенные операции, как то: блокировка, получение метаданных, контроль версий и другие. Этот протокол стал заменой для старого доброго FTP, чье время подошло к концу.

WebDAV предоставляет семь команд:

  • PROPFIND - получение свойств объекта на сервере в формате XML;
  • PROPPATCH - изменение свойств объекта;
  • MKCOL - создать папку на сервере;
  • COPY - копирование на стороне сервера;
  • MOVE - перемещение на стороне сервера;
  • LOCK - заблокировать объект;
  • UNLOCK - снять блокировку с объекта.

Таким образом, WebDAV позволяет изменять свойства хранящихся на сервере объектов, выполнять поиск с учетом свойств, блокировать объект (в нашем случае - файл) для организации возможности его редактирования только одним пользователем в распределенной среде, в которой доступ могут иметь много юзеров, управлять версиями файлов (посредством унаследованных команд check -in, -out), а также производить расширенный контроль доступа к файлам на основе списков.

Кроме того, WebDAV поддерживает унаследованные команды: GET - для скачивания файла, PUT - для заливки на сервер и DELETE - для удаления объекта. Мы не будем рассматривать все команды; в моем случае для реализации функционала утилиты мне понадобилось лишь четыре.

Ныне в разработке протокола участвуют Microsoft, Mozilla, Novell, IBM и другие. Поэтому не стоит удивляться тому, что поддержка WebDAV присутствует во многих продуктах Microsoft (в том числе Internet Explorer, проводнике, веб-сервере IIS и других), браузере Mozilla Firefox, продуктах фирмы Novell, IBM. Дополнительно, с помощью установки плагинов «подружить» с протоколом можно Total Commander и FAR.

Как уже было упомянуто, в Windows удаленное хранилище WebDAV можно подключить в проводник как дополнительный диск. Подобным образом можно поступить в OS X, организовав подключение к WebDAV-серверу как дополнительную директорию в обозревателе Finder.

Возможные решения

Передо мной стояла задача подключиться и организовать работу с данными на двух файловых хранилищах: Яндекс.Диск и Dropbox. Оба эти сервиса поддерживают работу по протоколу WebDAV. Регистрируя почту на Яндексе, ты автоматом получаешь доступ к 10 Гб облачного хранилища, к которому можно подключиться не только через стандартный клиент, но и с помощью сторонней тулзы (например, своей программы) посредством протокола WebDAV. При регистрации на Dropbox ты получаешь 5 Гб дискового пространства, которое можно использовать через стандартный клиент. Однако, чтобы получить доступ к хранилищу по WebDAV, надо пройти дополнительную регистрацию. В итоге, как выяснилось, этот доступ не бесплатный, тем не менее после регистрации дается свободный доступ на две недели. Размеры хранилищ можно увеличивать: или через доплату, или с помощью участия в разных акциях, проводимых сервисами, например находить баги и сообщать о них разработчикам.

Когда мне понадобилось написать программу для работы по WebDAV-протоколу, я первым делом заглянул в Win32 API, чтобы посмотреть, есть ли там функции для этого, подобно имеющимся для работы с FTP. Забегая вперед, отмечу, что сроки у меня стояли сжатые, поэтому использовать функции уровня API я не собирался. Как и следовало ожидать, в Win32 API, начиная с версии для Windows Vista, входит WebDAV API . В него входит одно перечисление, три структуры и набор функций. Я подумал, что это хороший знак, поскольку на основе стандартного API непременно имеются более высокоуровневые решения и мне не придется засиживаться с функциями API-интерфейса.

Тут под руку попалась Delphi XE3, и я решил проверить, какие инструменты для работы с протоколом WebDAV есть у нее. Оказалось, что в ней (на вкладке Indy Clients палитры компонентов) есть компонент IdWebDav. Я уже подумал, что на этом исследования закончились… Но обнаружилось, что этот компонент ни в какую не коннектится к Яндексу (Яндекс.Диск был для меня более приоритетным сервисом, поэтому все тесты я в первую очередь проводил на нем).

Затем я решил воспользоваться старой, но проверенной временем сетевой библиотекой Synapse для Delphi. К тому же в Рунете есть прекрасный сайт, содержащий несколько статей, посвященных этой либе, www.webdelphi.ru . На первых порах работа двигалась хорошо, и мне удалось реализовать несколько функций протокола: создание папки, скачивание файлов, получение свойств объектов. Но самую главную функцию - загрузку файлов на сервер с локального компа - реализовать так и не удалось. Стало грустно: в интернете об этом протоколе толковой информации нет. Bing нашел несколько платных наборов компонентов для работы с сетью, одной из которых я ради интереса решил воспользоваться, чтобы выяснить, реально ли загрузить файл на Яндекс.Диск. Этой либой оказалась Clever Internet Suite. Создав компонент класса clWebDav, одной строчкой кода удалось закинуть файл на сервер:

где stream - файловый поток, предварительно созданный для чтения.

Прекрасно, но отталкивает стоимость этой либы: более 500 у. е., что не есть гуд. Если ты захочешь воспользоваться этим способом, то обрати внимание на версию библиотеки: к Яндексу можно подключиться только с помощью версии 7.0 и выше, если воспользоваться распространенной на просторах Сети версией 6.0, то загрузка данных на сервер не удастся. На этом «играться» с Delphi мне надоело, и я решил обратиться к dotNET и C#.

Подключаемся к Yandex.disk + создаем коллекцию

Поскольку WebDAV работает поверх HTTP/S, я решил воспользоваться классами HttpWebRequest и HttpWebResponse, которые входят в.NET Framework начиная с версии 2.0. При этом мы будем использовать.NET Framework 4.0 - почему, скажу ниже. Коротко говоря, первый из перечисленных классов представляет HTTP-запрос, второй - HTTP-ответ. Наша задача - правильно сформировать запрос таким образом, чтобы его мог понять WebDAV-сервер. Чтобы узнать, как правильно оформлять запросы WebDAV-серверу, обратимся к документации Яндекса по использованию протокола WebDAV .

Следующим действием напишем небольшую программу, способную выполнить четыре операции: создать папку на удаленном хосте, загрузить объект, скачать объект и удалить объект. Этих операций достаточно для большинства приложений, решающих производственные задачи. Для простоты создадим WinForms-приложение. В паре слов расскажу о своей проге. Она представляет собой консольное приложение, запускаемое батником по расписанию. Ее основное действие - это заливка файлов на удаленный хост, при этом в ее задачи входит корректная обработка маски для выбора файлов, а также обработка путей, по которым они размещены, плюс правильное создание в облаке иерархии папок, подобной размещенной на локальном диске. Кроме того, поскольку программа работает в автоматическом режиме, она создает файл с логами. В нашей сегодняшней программе мы опустим эти действия (очевидно, что они не относятся к теме) и сконцентрируемся на протоколе WebDAV.

Обрати внимание: при создании заготовки проекта за основу лучше взять.NET Framework 4.0. И хотя поддержка WebDAV появилась еще во второй версии, по тестам стало видно, что та же самая программа, перекомпилированная с использованием.NET 4, работает в два раза быстрее, и это касается скорости работы с файлами и их пересылкой.

После создания заготовки приложения размести на его форме четыре кнопки. Первой операцией, которую мы реализуем, будет создание папки (или коллекции). Она самая простая из всех. На заметку: хотя Яндекс.Диск работает по защищенному протоколу HTTPS, папку можно создать по HTTP. Также на форме нам понадобятся четыре поля ввода: для задания адреса удаленного хоста (пока нацелимся на Яндекс.Диск: https://webdav.yandex.ru/), для ввода имени пользователя, пароля (для аутентификации на Яндексе) и ввода имени папки, которую мы хотим создать в облаке (рис. 1). Обрати внимание: адрес сервера надо вводить вместе с указанием протокола, в данном случае https://.

Первым делом в коде подключи пространства имен: using System.Net; - для работы с сетью и using System.IO; - для файлового ввода-вывода. Затем создай обработчик события нажатия на кнопку CreateDir. В него напиши такой код:

String folder = folderEdit.Text; String url = urlEdit.Text; String userName = nameEdit.Text; String password = passwordEdit.Text; url += folder; url = url.TrimEnd(); HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest; request.Credentials = new NetworkCredential(userName, password); request.Method = WebRequestMethods.Http.MkCol; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); HttpStatusCode code = response.StatusCode;

Вкратце обсудим код. В начале для удобства размещаем данные из полей ввода в переменные: имя папки, адрес хоста, имя и пароль юзера. Далее формируем URL-адрес: к адресу хоста прибавляем имя создаваемой папки. Как и у HTTP, у WebDAV есть стандартный номер порта - 443, поэтому его указывать необязательно. Теперь на основе URL мы можем создать объект HTTP-запроса, что делается в следующей строке. После создания надо заполнить некоторые его свойства. То есть необходимо указать такие данные, которые будут переданы серверу в заголовке запроса. Смотрим документацию Яндекса (ссылка приведена выше). В число необходимых параметров входят данные аутентификации. Яндекс принимает эти данные в двух видах: Basic - логин и пароль, QAuth - токен по протоколу QAuth. Мы выберем первый путь. Однако в таком случае данные должны быть закодированы. Это осуществляет объект класса NetworkCredential, конструктор которого получает имя и пароль в виде строк. Созданный объект этого класса присваивается свойству Credentials объекта запроса. Следующей строкой мы сообщаем, какую команду мы хотим выполнить, - MKCOL. В этом случае никакие данные передавать/получать не требуется, и сразу после этого мы отправляем запрос. Далее мы можем посмотреть, какой ответ вернул сервер, в случае успеха ответом будет строка Created. В классе HttpWebRequest определено много ответов на все случаи совместного общения клиента и сервера.

WebDAV-протокол не позволяет создать несколько вложенных папок за один запрос, например /folder1/folder2/; можно создать только одну папку: /folder1/. Если каталог существует, а отправленный запрос пытается создать одноименную директорию, в таком случае сервер сгенерирует исключение, которое надо перехватить конструкцией try/catch. В приведенном выше примере не происходит обработка исключений, поэтому если будешь использовать этот код в своем приложении, то не забудь ее добавить. Если необходимо узнать, существует каталог или нет, то для этого можно воспользоваться запросом PROPFIND, а потом получить и пропарсить ответ сервера, содержащий инфу в формате XML о имеющихся на сервере объектах. Но это получится долго, и, на мой взгляд, лучше использовать запрос MKCOL и в случае присутствия одноименной папки обработать исключение. Таким образом в своей консольной утилите я создаю иерархию папок. Кроме того, если одноименный каталог уже существует, происходит заход в него.

Удаление объекта

Удаление файла и/или директории по протоколу WebDAV реализуется так же просто, как создание коллекции. Для реализации этой задачи послужит приведенный выше код, в котором надо заменить строчку, задающую выполняемый сервером метод, на следующую:

Request.Method = "DELETE";

Как видно, в классе WebRequestMethods.Http отсутствует метод Delete, но мы можем задать желаемый метод в виде строки. Она будет отправлена на сервер, главное, чтобы он был в состоянии обработать и выполнить этот метод, а WebDAV-сервер, как мы знаем, на это способен.

В этом случае также лучше использовать конструкцию try/catch для перехвата исключения, которое может возникнуть по причине отсутствия удаляемого объекта.

Скачивание файла

Чтобы скачать файл из облачного хранилища по протоколу WebDAV, нужно проделать не так уж много манипуляций с имеющимся кодом. Но для начала закинь какой-нибудь файл в облако стандартными средствами (через веб-интерфейс или десктопный Яндекс-клиент). По замыслу, при скачивании файла в четвертое (нижнее) поле ввода мы будем вводить имя файла, который хотим закачать. Это же имя присвоим файлу-результату на локальном компе. Заметь, на сервере мы можем указать /Software/file.txt и будет получен доступ к файлу в папке Software, однако в локальной файловой системе автоматом папка создана не будет, поэтому ее предварительно надо создать. Коротко говоря, мы будем качать файл ZuneSetupPkg.exe (незаменимая тулза для работы с Windows Phone, которую частенько приходится доустанавливать на чужих компах, поэтому она всегда у меня под рукой - в облаке) из корня Яндекс.Диска в директорию с экзэшником.

В обработчике нажатия на кнопку Download после инициализации переменных, создания объекта-запроса и задания полномочий (Credentials) задай тип метода: GET (см. исходник в материалах к номеру). Затем, получив ответ сервера (объект класса HttpWebResponse), объявим переменные для чтения данных:

Int byteTransferRate = 8192;// Размер буфера byte bytes = new byte;// Буфер int bytesRead = 0; long totalBytesRead = 0; long contentLength = long.Parse(response.GetResponseHeader("Content-Length"));

В последней строчке кода читаем из заголовка ответа от сервера размер файла и сохраняем его в переменную. Дальше создаем файловый поток для записи файла на диск:

FileStream fs = new FileStream(fileToDownload, FileMode.Create, FileAccess.Write);

Затем получаем поток от сервера:

Stream s = response.GetResponseStream();

Порциями читаем из него данные и пишем их в файл, пока есть что писать:

Do { bytesRead = s.Read(bytes, 0, bytes.Length); if (bytesRead > 0) { totalBytesRead += bytesRead; fs.Write(bytes, 0, bytesRead); } } while (bytesRead > 0);

После того как все данные записаны в файл, закрываем оба потока и серверный ответ. Во время считывания данных мы увеличивали переменную totalBytesRead на количество считанных байт. В этом случае при отсутствии ошибок размер этой переменной должен стать равным размеру, который мы считали из заголовка, и если это так, то файл скачан корректно и мы выводим сообщение об этом (рис. 2), если же размеры не равны, тогда произошла неудача, об этом мы тоже сообщаем пользователю.

Этот код не лишен исключений, которые надо ловить, среди них: (404) невозможно найти файл (на сервере), невозможно записать в указанное место и многие другие.

Загрузка файла на сервер

Последняя операция, без которой наша утилита будет неполной, - это загрузка файла на удаленный хост. Это самая «хитрая» операция. Обсужденные выше операции не вызвали ни малейшего затруднения, но эта оказалась покруче! Я уже рассказывал, что с реализацией загрузки файла были трудности при использовании других средств разработки. И не все гладко было на C#. Вначале в документации посмотрим, какой запрос для заливки файла ждет Яндекс (рис. 3).

В полноценной программе надо осуществлять закачку сразу нескольких файлов (по желанию юзера), выбор файлов по маске, создание иерархии каталогов и, наконец, обработку ошибок. Мы же, чтобы не толочь воду в ступе, все это опустим и сконцентрируемся на загрузке одного заданного файла, без создания папок и обработки ошибок. Все это оставим тебе в качестве домашнего задания. Итак, в подготовленной мной проге из обработчика нажатия на кнопку вызывается метод UpdateFile, ему передаются имя хоста и имя загружаемого файла, которые берутся из соответствующих полей ввода. Начало самого метода подобно рассмотренным выше, однако теперь в заголовке запроса мы передаем на выполнение сервером команду PUT, то есть выказываем наше желание загрузить файл. Если при выполнении предыдущих запросов мы особо не опирались на документацию, то на этот раз она нам очень пригодится: включим в заголовок запроса все рекомендуемые Яндексом поля, а также некоторые дополнительные. Итак, рассмотрим код заголовка, а потом обсудим траблы:

Request.ContentLength = fileLength; request.KeepAlive = false; request.ReadWriteTimeout = -1; request.Timeout = -1; request.AllowWriteStreamBuffering = false; request.PreAuthenticate = true; request.SendChunked = false; request.ContentType = "application/binary"; request.ProtocolVersion = HttpVersion.Version11; request.ServicePoint.ConnectionLimit = 1; request.AllowAutoRedirect = false; //request.Expect = "100-continue"; request.ServicePoint.Expect100Continue = true; request.Accept = "*/*";

Значения некоторых параметров выведены методом научного тыка. Некоторые свойства зависят от других. Так, лучше отключить постоянное подключение (вторая строчка), ибо при этом генерируется исключение о невозможности одновременной чтения и записи в поток. Следующие два свойства задают тайм-аут для чтения и записи в сетевой поток. Значение -1 означает бесконечность. Размер загружаемого файла может быть неопределенно большим, поэтому мы не можем загадывать на время, которое понадобится для его загрузки. Следующее свойство: AllowWriteStreamBuffering - очень любопытное, оно включает или отключает буферизацию данных перед отправлением. При включении отправляемый файл сначала загружается в память, только после этого выгружается на сервер. Странность этого свойства заключается в том, что на некоторых хостах можно без проблем, отключив буферизацию, залить файл, однако на других будет всплывать исключение о необходимости буферизации. Возможно, это связано с какими-то настройками реестра или связи; не исключаю также различия между сервисами. В случае если буферизация включена и на сервер отправляется большой файл, может не хватить ресурсов (исключение SystemOutOfMemory). В свою прогу можешь добавить флажок для включения и отключения буферизации. Если буферизация отключена, тогда надо включить флаг PreAuthenticate (следующее свойство), с помощью которого данные аутентификации отправляются вместе с заголовком. Следующий параметр SendChunked (только для Яндекс.Диска) позволяет загружать на удаленный хост файлы заранее неопределенного размера, на что Dropbox отвечает исключением. Далее указываем тип передаваемых данных, версию используемого протокола (11 означает 1.1), количество возможных HTTP-подключений: больше одного ни к чему. Запрещаем автоматическое перенаправление. Чтобы задать следующее рекомендуемое поле: “Expect: 100-continue”, включающее ожидание ответа для запроса загрузки, нельзя использовать закомментированное свойство, надо использовать код, который строчкой ниже: request.ServicePoint.Expect100Continue = true;. Последним свойством HTTP-заголовка включается маска для принимаемых объектов, в нашем случае принимаются любые файлы: с произвольным именем и расширением.

После того как запрос сформирован, надо получить сетевой поток, в который мы будем записывать данные, отправляемые на сервер. Также открываем локальный файл для чтения. Выделяем байтовый буфер для временного хранения считанных из файла данных; затем в цикле начинаем читать и отправлять, записывая данные в поток. После этого закрываем сетевой и файловый потоки, в общем, как обычно. Получив ответ от сервера, проверяем HTTP-статус на его равенство флагу Created и сравниваем размер файла с количеством переданных байт; если оба условия выполняются, значит, пересылка успешна, иначе - возникла проблема.

Итоги

На этом разработка нашей утилиты подошла к концу. В ней мы реализовали весь планируемый функционал - четыре самые нужные команды, без которых не может обойтись ни один менеджер управления файлами на удаленном хосте. Мы не стали привязываться к услугам определенного хостинга, используя его API, мы разработали универсальное приложение, общающееся с сервером по стандартному протоколу WebDAV. Это позволило нашей программе, используя один код, подключаться сразу к нескольким серверам (я тестировал на Yandex.disk и Dropbox). Тем не менее, как мы увидели, разные сервисы несколько по-разному интерпретируют и поддерживают протокол.

Дальнейшее развитие проги предоставляю тебе, по ходу статьи я указал на возможные улучшения: это и загрузка нескольких файлов, и создание иерархии папок, и распараллеливание загрузки, и многое другое. Если копнуть глубже в протокол WebDAV, можно реализовать другие команды для управления контентом на сервере.

На этой ноте я хочу пожелать тебе удачи во всех делах и быть побольше на свежем воздухе:). До встречи на страницах ][!