Быстрая настройка S3 хранилища от Selectel в ASP.NET
Введение
Эта статья предназначена для быстрой и простой настройки работы с S3-хранилищем от Selectel. Мы также обсудим пару важных аспектов, которые часто не рассматриваются в других материалах по этой теме.
Настройка Selectel
Чтобы начать работу, нужно пополнить баланс на 100 рублей. Это даст возможность пользоваться объектным хранилищем.
Вот как его найти:
Теперь необходимо создать хранилище, сервер выбираем Санкт-Петербург, устанавливаем тип сервера на «публичный». Больше никаких галочек не трогаем — просто добавляем название и создаем.
После переходим по такому пути:
Аккаунт -> Пользователи -> Сервисные Пользователи
Здесь создаем нового пользователя и в правах указываем "Администратор объектного хранилища".
Далее нам нужно сгенерировать PUBLIC и SECRET KEY, чтобы через созданного пользователя управлять хранилищем. Для этого нажмите на имя пользователя, чтобы открыть его настройки, и сгенерируйте ключи.
⚠СРАЗУ СОХРАНИТЕ КЛЮЧИ, ЧТОБЫ НЕ ПОТЕРЯТЬ⚠
На этом базовая настройка в Selectel заканчивается. Если вдруг что-то осталось непонятным по скринам и описанию, вы можете посмотреть видео на YouTube, где подробно рассказывается о преимуществах использования объектного хранилища и о том, как его настроить с примерами (на Python 🙃).
Работаем с хранилищем с помощью AWS S3 в ASP.NET
Для начала необходимо установить через NuGet библиотеки AWSSDK.S3 и AWSSDK.Extensions.NETCore.Setup, а также отредактировать файл appsettings.json.
В этом файле нужно указать URL, по которому мы будем обращаться к серверу, ключи, имя контейнера (например, test-bucket) и регион.
Настроим DI, добавив данные строчки кода в Program.cs
Далее необходимо создать end points и слой service для работы с S3 хранилищем. Не забудьте добавить конструктор у сервиса.
А вот и первый метод для сохранения файлов в хранилище. Чтобы передать файлы, нам необходимо конвертировать их в поток MemoryStream, а затем передать в PutObjectRequest.
Тут очень важный момент: может возникнуть ситуация, когда код выше будет работать некорректно, и при загрузке файлов вы заметите, что они не открываются должным образом. Если вы, например, загрузите текстовый файл, то внутри увидите следующую картину. А ведь изначально в txt было записано — 123.
Дело в том, что данные отправляются порционно, и из-за этого прилетают "битыми". Чтобы исправить эту проблему надо добавить буквально одну строчку кода.
Теперь если мы попробуем загрузить загрузить картинку в хранилище и перейдем внутрь, увидим следующую картину. Если вы нажмете на стрелочку, то файл откроется в новом окне.
Домен можно использовать для доступа к остальным файлам, например при работе на фронте
Обычные файлы — это, конечно, хорошо, но что делать, если нам понадобится загрузить в облако файл объемом в несколько гигабайт? В этом случае нам потребуется иной подход к решению проблемы. Большой файл необходимо разбить на маленькие кусочки, отправить в хранилище, а уже там он будет собирать эти пакеты воедино. Для этого мы напишем отдельный метод.
Вместо PutObjectRequest мы используем TransferUtilityUploadRequest. Как видно, разницы почти никакой, только дополнительно указываем, сколько максимальной памяти будут занимать пакеты при дроблении, а также некоторые параметры доступа
PublicRead - файл сможет прочитать любой пользователь.
S3StorageClass.StandardInfrequentAccess - предназначен для данных, которые реже запрашиваются, но требуют более быстрого доступа, когда они необходимы.
Кусочек с UploadProgressEvent не обязателен, я его написал для красивого вывода в консоль progress bar. Если он вам не нужен удалите также и progressCallback.
Методы для удаления и скачивания файлов выглядят следующим образом. Тут ничего интересного.
А вот и код контроллера. Я специально отдельно указал переменную path, так как в хранилище Selectel можно группировать файлы по папкам. Полный путь до файла определяется в переменной keyName.
Если директория не указана, путь будет выглядеть так: "file.txt", а если указана, то так: "text/file.txt". Также можно указать более глубокую вложенность, например: "documents/personal/text/file.txt".
Данный кусочек кода отвечает за вывод progress bar в консоль:
Попробуем загрузить картинку. Все работает.
Заключение
Мы рассмотрели ключевые аспекты, такие как загрузка файлов, обработка больших объемов данных и группировка по папкам. Надеюсь, эти советы будут полезны вам в вашей дальнейшей работе с файлами в облаке!