Организация шаринга файлов в приложении на С#

в 14:04, , рубрики: .net, облачные хранилища, Песочница, метки: , ,

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

Основные требования:

  • Отображение списка файлов.
  • Загрузка и скачивание через интерфейс программы.
  • Скрытая авторизация без участия пользователя.

Первое что пришло на ум — использовать облачное хранилище данных с доступом по API. Итак, что из этого вышло?

Первые проблемы

Я решил изучить API документацию таких сервисов как:

Сначала меня устраивали все хранилища. В каждом существовали методы загрузки, прямого скачивания, удаления, вывода списка файлов, а так же сниппеты и даже библиотеки взаимодействия API для NET. платформы. Вроде бы все что нужно! Но появились некоторые критические для меня моменты, например DropBox устанавливал ограничение на количество запросов к API — 5000 в день. И самая главная проблема хранилищ(в моей ситуации): DropBox, Box, Windows Live SkyDrive в способе авторизации клиентских приложений — OAuth. Такой вид авторизации не позволяет напрямую передать данные для входа в учетную запись. Остался только один претендент Ge.tt.

Файлы для всех

Ge.tt предоставляет пользователю бесплатное хранилище объемом 2Гб. Для взаимодействия с облаком, необходимо создать приложение и получить APIKey. Документация довольно скудная, но все необходимые функции есть. Условия использования полностью соответствуют требованиям заказчика. Модель авторизации простая: POST запрос с параметрами Email + Password + APIToken. Бонус к этому, готовая динамическая библиотека с реализацией необходимых функций, с ней мы и будем работать.

Реализация

Структура хранилища определяется следующим образом:

  • Shares (Шары) — отдельные элементы (папки) содержащие структуры.
  • Files (Файлы) — непосредственно структура с файлами.

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

  1. Авторизация.
  2. Обновление шар.
  3. Получение списка файлов в шарах.
  4. Загрузка файла.
Авторизация

Подключаем библиотеку к нашему проекту:

using Gett;

 // Логинимся 
Gett.Sharing.GettUser user = new Gett.Sharing.GettUser(20);//Максимальное число одновременных подключений. По умолчанию 2
            user.Login("qbxpm1maish5tgwjivqnl0a88jv2t9tim", "example@mail.com", "dj47vn3oc7");

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

Получаем файлы

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

user.RefreshMe();//POST запрос
            this.listBox_Share.Items.Clear(); 
            this.listBox_Files.Items.Clear();
 this.listBox_Share.Items.AddRange(user.Shares.GetShares()); //Добавление диапазона шар в listBox
// Gett.Sharing.GettShare[]  _shares = user.Shares.GetShares(); //Пример добавление шар в массив, если необходимо

Получение информации о файлах аналогичный процесс. В событии SelectedIndexChanged у listBox_Share пишем код:

 private void listBoxShare_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.listBox_Files.Items.Clear();
            if (this.listBox_Share.SelectedItem is Gett.Sharing.GettShare)// проверка типа данных
            {
                Gett.Sharing.GettShare share = (Gett.Sharing.GettShare)this.listBox_Share.SelectedItem;//присвоение переменной выделенного элемента
                this.listBox_Files.Items.AddRange(share.Files);// добавление диапазона данных о файлах в listBox_Files
    List<Gett.Sharing.GettFile> FileList = new List<Gett.Sharing.GettFile>();// пример создания массива  с информацией о файлах
                
            }
        }

Следует помнить, что мы получаем список файлов, который содержит:

  • Количество загрузок.
  • Порядковый номер.
  • Полное имя.
  • URL.
  • Размер.
  • Дата загрузки.

Чтобы получить необходимые свойства нужно обратиться к нужному элементу, и вызвать свойство Info:

 string name= FileList[0].Info.FileName;//имя файла в нулевом индексе массива
                long size = FileList[0].Info.Size;//размер файла

Теперь скачаем файл. Пишем код, напимер для того же SelectedIndexChanged:

 if (this.listBox_Files.SelectedItem is Gett.Sharing.GettFile)// проверка типа данных
            {
                Gett.Sharing.GettFile file = (Gett.Sharing.GettFile)this.listBox_Files.SelectedItem;//получение экземпляра файла

                SaveFileDialog saveDialog = new SaveFileDialog();//инициализируем saveDialog для сохранения файла
                saveDialog.OverwritePrompt = true;
                saveDialog.FileName = file.Info.FileName;

                if (saveDialog.ShowDialog() == DialogResult.OK)
                {
                  
                    file.DownloadFileAsync(saveDialog.FileName);// ассинхронная загрузка
                   
                }

Дальше дело вашей фантазии: удаляйте, переименовывайте файлы, создавайте каталоги. API открывает широкие возможности для реализации любых идей. Хорошая идея залог успеха!

Автор: ShadyRover

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js