Новая функция облачного хранилища: создание ссылок для загрузки файлов

storage-sharing

Недавно я участвовал в восхождении на Эльбрус. У всех участников группы, в том числе и у меня, были с собой фотоаппараты. Было сделано много интересных и красивых фотографий, и после похода встал вопрос: как сделать так, чтобы они были доступны всем участникам?

Кто-то предлагал загрузить все снимки ВКонтакте или на Facebook, кто-то — на Mail.Ru, кто-то — на другие файлообменники… Но все перечисленные сервисы нам не подходили: во-первых, на них имеются ограничения на размер загружаемых файлов; во-вторых, не все участники группы были на этих сервисах зарегистрированы.

Я предложил простое и удобное для всех решение: создал в облачном хранилище Selectel публичный контейнер, включил опцию листинга файлов. Затем создал ссылку, перейдя по которой каждый смог загрузить в контейнер собственные фотографии, а также скачать фотографии, сделанные другими участниками. При этом никому из участников группы не потребовалось заводить в хранилище учетную запись. Так была протестирована новая функция нашего облачного хранилища — создание ссылки для загрузки файлов сторонними пользователями. Мои товарищи по восхождению на Эльбрус оценили ее на «отлично».

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

Коротко о новой функции

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

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

  • для предоставления любым пользователям доступа к вашему хранилищу: например, друзья смогут загружать для вас свои фотографии, аудио- и видеозаписи, коллеги и партнеры — различные рабочие материалы и т.п.
  • для загрузки пользовательского контента на сайты;
  • для упрощения обмена файлами между участниками тематических интернет-сообществ;
  • для быстрого сохранения резервных копий.

Создание ссылки

Рассмотрим на простейшем примере, как работает новая функция. Создадим специальный контейнер для загрузки файлов и назовем его, например, share. Затем откроем меню контейнера и выберем пункт «Ссылка на загрузку файлов»:

uploadlink-001

Откроется окно настроек ссылки:
uploadlink-002

В этом диалоговом окне можно задать следующие параметры (более подробно о некоторых из них речь пойдет ниже):

  • выбрать тип ссылки;
  • ввести пояснительный текст для пользователей, которым вы отправляете ссылку для загрузки (пояснительный текст будет отображен в подзаголовке в верхней части страницы загрузки);
  • установить пароль на загрузку файлов;
  • установить ограничения на максимальный размер загружаемых в хранилище файлов;
  • ограничить срок действия ссылки, а также срок хранения загруженных файлов;
  • разрешить/запретить перезапись файла при загрузке в хранилище файлов с одинаковыми именами (если эта опция включена, то старый файл будет удален, а новый — сохранен; если отключена — старый файл удален не будет, а к имени нового файла будет добавлен дополнительный идентификатор).

Теперь нажимаем на кнопку “Создать ссылку”. На экране появится диалоговое окно со ссылкой, которую можно скопировать и отправить любому другому пользователю. Для каждого контейнера или папки можно создавать неограниченное количество ссылок для загрузки с различными комбинациями настроек.

Страница загрузки

Пользователь, получивший от вас ссылку и открывший ее в браузере, увидит следующую страницу:

На странице поддерживается одновременная параллельная загрузка трех файлов, и за счет этого процесс загрузки существенно ускоряется:
load-files

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

Настройки ссылок

Типы ссылок

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

Простая загрузка

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

Добавление времени загрузки в имя файла

При выборе этого варианта к имени загружаемого файла будут добавлены дата и время загрузки. Например, если вы загрузите файл myphoto.jpg, он будет сохранен как myphoto_20130830_12h43m53s.jpg.

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

Добавление уникального идентификатора в название файла

При выборе этого варианта к имени файла будет добавлен уникальный идентификатор. Например, файл myphoto.jpg после загрузки будет переименован в myphoto_cmrsm2ks.jpg.

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

Загрузка в уникальную папку

При выборе этого типа ссылки файлы во время каждого сеанса загрузки будут сохранятся в отдельную папку. Например, файл myphoto.jpg будет сохранен в папку с именем cmrsm2ks. Если вы после загрузки этого файла закроете страницу загрузки, а затем снова закроете ее и загрузите другие файлы, то они будут сохранены в другой папке, имя которой будет сгенерировано автоматически; для следующего сеанса загрузки будет также создана отдельная папка, и т.п.

Загрузка в папку по дате

Этот режим работы хорошо подходит для загрузки резервных копий. Загружаемые файлы будут сохраняться в папку с текущей датой в названии. Например, архив mysql.dump.bz2 после загрузки будет доступен как 2013-08-30/mysql.dump.bz2.

Загрузка в папку по часам

Этот режим в целом аналогичен предыдущему; единственное отличие заключается в том, что к имени папки помимо даты будет добавлено еще и время (час) загрузки. Архив mysql.dump.bz2 будет доступен как 2013-08-30_15/mysql.dump.bz2.

Загрузка с указанным именем

Этот тип ссылки больше подходит для использования через API для приложений или сайтов.
Ссылка будет действительна только для одной загрузки, а загруженный файл будет переименован по имени самой ссылки. Например, если ссылка имела вид http://xxxx.selcdn.ru/container/you_photo.jpg, то после загрузки файл будет доступен в хранилище под именем you_photo.jpg , а ссылка перестанет действовать.

Временные ограничения

При создании ссылки для загрузки можно устанавливать временные ограничения:
uploadlink-004

Это очень гибкая и полезная опция.
Она позволяет, во-первых, ограничить время действия самой ссылки. По истечении указанного вами срока сторонние пользователи не смогут загружать файлы в хранилище. Такая возможность может оказаться полезной в ситуациях, когда необходимо принимать документы от пользователей через Интернет к определенному сроку (например, при приеме заявок на конференции и конкурсы).

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

Дополнительные возможности

Для разработчиков

Управление ссылками может осуществляться через API и совместимо с Openstack Swift API. Используя библиотеки для работы с Openstack Swift API, вы можете легко создавать и настраивать ссылки для загрузки файлов в наше хранилище непосредственно из собственных приложений и сайтов.

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

Форма для загрузки файлов:

<form id="put-file">
 <input id="fileToUpload" type="file" />
 <input type="submit" />
</form>

Javascript-код:

(function() {
 var $putFile = document.getElementById('put-file');

 $putFile.onsubmit = function (event) {
 var req = new XMLHttpRequest();
 event.preventDefault()

 file = document.getElementById('fileToUpload').files[0]

 req.open("PUT", "https://xxx.selcdn.ru/containet/sendmefile_link");
 req.withCredentials = false;
 /* исходное имя файла */
 req.setRequestHeader("X-Filename", file.name);
 /* небольшой хак для установки правильного времени для загружаемого файла */
 TZ_OFFSET = (new Date).getTimezoneOffset();
 req.setRequestHeader("X-Sendmefile-TZ-Offset", TZ_OFFSET);
 req.send(file);
 req.onreadystatechange = function () {
 if(req.readyState === 4 && req.status === 200)
 alert(req.responseText)
 }

 return false;
 }
})()

Для системных администраторов

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

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

$ curl -i https://xxx.selcdn.ru/container/upload_link -T path_to/file.name -H "X-Filename: file.name"

Можно также организовать передачу данных через именованный канал (pipe), без сохранения в файл:

# загрузка со сжатием в архив “на лету”
$ bzip2 bigfile.dat -c | curl -i http://xxxx.selcdn.ru/container/upload_link -X PUT -d @- -H "X-Filename: bigfile.dat.bz2"

Еще одна интересная возможность — многопоточная загрузка файлов из определенной папки; это будет гораздо быстрее, чем с помощью нашей утилиты supload:

# паралельность определяется опцией -P
$ find path_to_dir/ -type f | xargs -I "{}" -n1 -P 10 curl http://xxxx.selcdn.ru/container/upload_link -i -X PUT -H "X-Filename: {}" -T "{}"

Резервное копирование

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

Послесловие

Как это часто у нас бывает, новая функция стала доступна пользователем за несколько дней до того, как она была официально анонсирована. Некоторые из наших клиентов уже попытались “прикрутить” ее к собственным сервисам, и мы уже получили от них обратную связь. В своих отзывах они высказали нам ряд замечаний и предложений, которые будут обязательно учтены в самое ближайшее время. Были высказаны и весьма интересные пожелания на будущее, в частности:

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

Приглашаем всех наших читателей попробовать новую функцию. Ссылка на тестовую версию страницы загрузки: http://23728.selcdn.ru/sendmefile-test/upload (все файлы будут храниться в течение часа, сама ссылка будет доступна 30 дней с момента публикации статьи).

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