Довольно интересной находкой оказался PaaS-хостинг от Google — Google App Engine (далее GAE), который дает возможность хранить до 5 Гб файлов при 1 Гб входящего и 1 Гб исходящего трафика в день, и кроме всего прочего, в нем используется модель High Replication, то есть ваши данные будут хранится сразу на нескольких серверах по всему миру!
Особенностью GAE является несколько нестандартный интерфейс для работы с файлами, поэтому я и сделал собственный сервис, о чем расскажу в данной статье.
GAE дает возможность создавать приложения на Java, Go и Python. Так как первые два языка для меня почти незнакомы, я написал свой сервис на Python. Ранее можно было использовать только версию 2.5, что создавало определенные сложности, но недавно добавили поддержку 2.7, поэтому теперь не нужно вспоминать устаревшие подходы.
Чтобы начать использовать GAE, скачайте и установите Python версии 2.7, а также appengine SDK для своей операционной системы. Повествование будет вестись на примере версии SDK для Linux (в Windows и Mac есть удобный графический интерфейс, так что разобраться будет несложно, хотя можно делать все из консоли, как описано ниже).
Чтобы в дальнейшем было проще с настройками, рекомендуется заранее зарегистрировать приложение на http://appengine.google.com, нажав кнопку “Create application”. Вам предложат ввести уникальный идентификатор приложения, по которому оно будет доступно как поддомен appspot.com, а также название, которое в дальнейшем можно будет менять, в отличии от идентификатора. Все остальные настройки можно не трогать, в нашем случае они не имеют особого значения. Для начала работы, создайте папку с именем, которое соответствует вашему идентификатору, в которой будут храниться все файлы, относящиеся к приложению.
Любое приложение состоит, как минимум, из файла app.yaml, в котором размещены название приложения, версия исполняемой среды и описание обработчиков URL и различных ошибок. Обработчик URL состоит из регулярного выражения, с помощью которого проверяются ссылки, а также описания необходимых файлов. Отмечу, что в именах скриптов для обработчиков, теперь нужно ставить расширение (которое вообщем-то уже и не расширение, а объект в приложении) не ‘.py’, а ‘.app’
Для нашего приложения файл app.yaml имеет следующий вид:
Для хранения файлов, в App Engine есть специальное хранилище Blobstore, а для данных — Datastore (отмечу, что используется нереляционная модель хранения данных; для доступа к данным имеется собственный фреймворк, похожий на ORM из Django). В нашем приложении каждому файлу присвоен объект FileRecord в Datastore со встроенным уникальным целочисленным идентификатором (имеется в виду извлечение ключа объекта по id), содержащий в себе объект BlobReferenceProperty:
Для более конкретного разбора URL и вообще, для инициализации приложения, в конце файла создается объект app, который является представителем WSGIApplication:
В зависимости от полученного URL, приложение запускает соответствующий обработчик. В данном случае частично дублируются обработчики из app.yaml, поскольку в нем указаны настройки для авторизации.
Приложение работает следующим образом:
- При обращении к ‘/’ проводится авторизация пользователя, затем загружаются все записи и выводится форма для загрузки файла.
- При обращении к ‘/upload’, которое происходит автоматически при загрузке файла, создается объкт в Blobstore, который связывается с объектом в Datastore, затем в случае успех производится переход на ‘/’.
- При обращении к ‘/delete/’ из URL извлекается номер объекта, после чего тот удаляется.
- При обращении к ‘/get/’ из URL также извлекается номер объекта, после чего файл связанный с ним отправляется на загрузку.
Для проверки работы приложения, запустите отладочный сервер в консоли:
Если хотите, чтобы сервер был доступен по сети, добавьте параметр --address 0.0.0.0 после dev_appserver.py.
Если никаких проблем не возникло, можно приступить к загрузке приложения:
Далее у вас спросят логин и пароль к учетной записи в Google, после чего приложение загрузится и будет доступно по адресу appid.appspot.com, где appid — это ваш уникальный идентификатор.
Исходные коды приложения на code.google.com (для использования достаточно просто отредактировать файл app.yaml): http://code.google.com/p/fileshare-appengine/
Преимущества перед существующими файлообменниками:
- Не нужно смотреть рекламу, ждать минуту и т.п.
- Файл можно скачать по прямой ссылке.
- Очень высокая надежность.
- Только вы управляете тем, что залито на ваш файлообменник. Его не закроют из-за другого пользователя
- В указанных пределах использования ресурсов все бесплатно.
- Если даже выделенных ресурсов мало, можно сделать еще одно приложение (это уже личные домыслы, в правилах конкретно на этот случай ничего нету, так что лучшу поузнавать. UPDATE: правилами это все-таки запрещено).
- Не совсем ясно насчет максимального размера файла — в русской документации написано 2 Гб, а в английской — 32 Мб.
- Выяснилось, что русские имена файлов не поддерживаются. Пока не совсем понял, почему.
UPDATE: Если на этапе загрузки скрипта в Windows выдается ошибка вида UnicodeDecodeError, возможно поможет удаление всех ключей, в которых есть кириллица, из ветки реестра HKEY_CLASSES_ROOT/Mime/Database/ContentType