Сегодня у нас есть множество альтернатив для хранения документов или изображений, особенно облачные варианты. Одной из альтернатив может быть хранилище firebase, которое позволяет нам подключаться из любого приложения, независимо от языка. На этот раз мы интегрируем Api в .Net 5 с хранилищем firebase.
Этот пост состоит из трех частей:
- Создание проекта firebase
- Создание пользователя в firebase
- Интеграция Api в .Net 5
Создание проекта firebase
Сначала мы должны завести учетную запись google.
Затем мы должны войти в консоль firebase
Создайте новый проект
Шаг 1: Название проекта
Шаг 2: Деактивируйте google analitycs для проекта.
После создания проекта мы выбираем в меню пункт хранения
Запустите в режиме производства и выберите местоположение
В разделе правил мы копируем и вставляем следующий код
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
Создание пользователя в firebase
Чтобы получить доступ к хранилищу firebase, мы должны создать пользователя в разделе Authentication и нажать кнопку start
Выбираем метод аутентификации по электронной почте
На вкладке пользователи мы добавляем нового пользователя
Интеграция Api в .Net 5
После выполнения предыдущих шагов мы готовы подключить наш .Net 5 api к firebase. Для этого мы будем использовать код из следующего репозитория:
Net Core Firebase Storage
Проект разделен на три уровня
- FirebaseStorageApp
- FirebaseStorageApp.Model
- FirebaseStorageApp.Services
FirebaseStorageApp
Это наш api, где мы выставляем конечную точку для загрузки документов:
[HttpPost]
public async Task<IActionResult> Post([FromBody] FileModel file)
{
string fileUrlFirebase = await Upload(file);
return Ok(new { fileUrlFirebase });
}
private static async Task<string> Upload(FileModel file)
{
var fileFromBase64ToStream = FirebaseStorageService.ConvertBase64ToStream(file.FileBase64);
var fileStream = fileFromBase64ToStream.ReadAsStream();
string fileUrlFirebase = await FirebaseStorageService.UploadFile(fileStream, file);
return fileUrlFirebase;
}
В данном примере мы будем использовать переменные окружения с необходимыми ключами для подключения к firebase. Эти переменные должны быть заменены в файле Properties/launchSettings.json:
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"API_KEY_STORAGE": "Your api key storage",
"AUTH_EMAIL": "your email authentication ",
"AUTH_PASWORD": "your password autenticaction",
"BUCKET_STORAGE": "your bucket name"
}
}
AUTH_EMAIL и AUTH_PASWORD: мы должны ввести те, которые были настроены в шаге 2 этого поста.
API_KEY_STORAGE: в firebase мы получаем его в Project Settings < General:
BUCKET_STORAGE: в firebase мы получаем его в хранилище, опустив gs://:
FirebaseStorageApp.Model
В этом слое у нас есть класс с данными, которые мы будем запрашивать для сохранения документов. Это будет использоваться в контроллере и сервисном уровне.
public class FileModel
{
[Required(ErrorMessage = "This field is required")]
[MinLength(5, ErrorMessage = "5 characters is required")]
public string FileBase64 { get; set; }
[Required(ErrorMessage = "This field is required")]
[MinLength(5, ErrorMessage = "5 characters is required")]
public string FileName { get; set; }
[Required(ErrorMessage = "This field is required")]
[MinLength(5, ErrorMessage = "5 characters is required")]
public string FolderName { get; set; }
}
FirebaseStorageApp.Services
Это наш сервисный уровень, на котором мы будем подключаться к firebase.
Для этого нам нужно установить два пакета nugget, FirebaseAuthentication.net и FirebaseStorage.net:
После загрузки мы можем подключиться к следующему классу:
public static class FirebaseStorageService
{
private static readonly string _apiKey = Environment.GetEnvironmentVariable("API_KEY_STORAGE");
private static readonly string _bucket = Environment.GetEnvironmentVariable("BUCKET_STORAGE");
private static readonly string _email = Environment.GetEnvironmentVariable("AUTH_EMAIL");
private static readonly string _Password = Environment.GetEnvironmentVariable("AUTH_PASWORD");
public static StreamContent ConvertBase64ToStream(string fileBase64)
{
byte[] stringToBase64 = Convert.FromBase64String(fileBase64);
StreamContent streamContent = new(new MemoryStream(stringToBase64));
return streamContent;
}
public static async Task<string> UploadFile(Stream stream, FileModel file)
{
string fileFromFirebaseStorage = string.Empty;
FirebaseAuthProvider firebaseConfiguration = new(new FirebaseConfig(_apiKey));
FirebaseAuthLink authConfiguration = await firebaseConfiguration
.SignInWithEmailAndPasswordAsync(_email, _Password);
CancellationTokenSource cancellationToken = new();
FirebaseStorageTask storageManager = new FirebaseStorage(_bucket,
new FirebaseStorageOptions
{
AuthTokenAsyncFactory = () => Task.FromResult(authConfiguration.FirebaseToken),
ThrowOnCancel = true
})
.Child(file.FolderName)
.Child(file.FileName)
.PutAsync(stream, cancellationToken.Token);
try
{
fileFromFirebaseStorage = await storageManager;
}
catch (Exception e)
{
}
return fileFromFirebaseStorage;
}
}
После того, как код был объяснен в общих чертах, мы готовы к загрузке наших файлов. По следующей ссылке вы можете получить пример json для тестирования api: Пример тела
При выполнении сообщения конечная точка вернет url для визуализации загруженного документа:
{
"fileUrlFirebase": "https://firebasestorage.googleapis.com/v0/b/pruebas-fc979.appspot.com/o/documents%2Fpdf_prueba?alt=media&token=6a52c316-661a-48b6-8505-206f3a4b202a"
}
Если мы проверим в консоли, то увидим новый загруженный файл