ASP.NET Core 上傳檔案到 Firebase Storage

Posted on 2018-12-28

先前的文章已經有介紹過啟用 Firebase 的 Storage 服務ASP.NET Core 的檔案上傳,接下來就來看如何使用 ASP.NET Core 把檔案上傳到 Firebase 的 Storage 吧

ASP.NET Core 2.2

安裝套件

登入 Firebase

  • 需要使用先前文章建立好的相關資訊,請自行替換
    • _apiKey
    • _email, _password
    • _host,只有 Host 的部份,例如 mymvc.appspot.com
  1. 使用 ApiKey 建立 AuthProvider
  2. 使用 AuthProvider 加上帳號和密碼作登入,登入後會拿到登入的資訊
  3. 使用 Host 和登入的資訊取得 FirebaseStorage
private async Task<FirebaseStorage> FirebaseStorage()
{
    var auth = new FirebaseAuthProvider(new FirebaseConfig(_apiKey));
    var loginInfo = await auth.SignInWithEmailAndPasswordAsync(_email, _password);
    var storage = new FirebaseStorage(_host, new FirebaseStorageOptions
    {
        AuthTokenAsyncFactory = () => Task.FromResult(loginInfo.FirebaseToken),
        ThrowOnCancel = true
    });
    return storage;
}

上傳檔案

  • 和先前檔案上傳的文章結合
  1. 先拿到登入後 Firebase 的 Storage
  2. 檔案上傳後轉成 MemoryStream
  3. 使用 storage 的 PutAsync,傳入 MemoryStream 就可以把檔案上傳
    • 檔名和資料夾都可以使用 Child 設置
var storage = await FirebaseStorage();
var url = string.Empty;
using (var ms = new MemoryStream())
{
	img.CopyTo(ms);
	ms.Seek(0, SeekOrigin.Begin);

	url = await storage.Child(img.FileName).PutAsync(ms);
}
  • 測試,上傳後可以拿到圖片的 URL

  • 檢查 Firebase,可以看到上傳的檔案

  • 加入資料夾 Folder 測試
await storage.Child("Folder").Child(img.FileName).PutAsync(ms);
  • 檢查 Firebase,可以看到多了一個資料夾

刪除檔案

  • 其實和上傳差不多,只是把方法換成 DeleteAsync
var storage = await FirebaseStorage();
try
{
    await storage.Child(fileName).DeleteAsync();
}
catch (Exception e)
{
    var msg = e.Message;
}
  • 如果刪除不存在的檔案會發生 Exception,需要注意

後記

  • 如果有檔案或是圖片上傳的需求,用 Firebase 是一個不錯的選擇,不過使用免費方案的話需要注意額度不要超限了,請參考官方網頁
  • 之前的使用過程踩從登入到上傳都採了不少的雷,不過現在再看程式碼好像沒有什麼 Orz…
  • 有機會在來介紹 Firebase 的 Realtime Database