In this blog post, you will learn how to Upload, Download and Delete file using Firebase Storage in Xamarin.Forms.
Introduction
Xamarin.Forms - Working With Firebase Realtime Database CRUD Operations
Xamarin.Forms code runs on multiple platforms - each of which has its own filesystem. This means that reading and writing files is most easily done using the native file APIs on each platform. Alternatively, embedded resources are a simpler solution to distribute data files with an app.
Firebase
Firebase gives you functionality like analytics, databases, messaging and crash reporting so you can move quickly and focus on your users.
Firebase is a backend platform for building Web, Android, and iOS applications. It offers real-time database, different APIs, multiple authentication types and hosting platform. This is an introductory tutorial, which covers the basics of the Firebase platform and explains how to deal with its various components and sub-components.
Build apps with Firebase
- Real-time Database
- Storage
- Notifications
- Authentication
- Hosting
- Visual Studio 2017 or Later(Windows or Mac)
- Setting up a Xamarin.Forms Project
https://github.com/susairajs/Xamarin-Firebase-Storage
Visual Studio 2019 has more options in the opening window. Clone or check out the code from any repository or, open a project or solution for your computer.
Now, you need to click "Create a new project".
Now, filter by Project Type: Mobile
Choose the Mobile App (Xamarin. forms) project under C# and Mobile.
Name your app. You probably want your project and solution to use the same name as your app. Put it on your preferred location for projects and click "Create".
Now, select the blank app and target platforms - Android, iOS and Windows (UWP).
Subsequently, go to the solution. In there, you get all the files and sources of your project (.NET Standard). Now, select XAML page and double-click to open the MainPage.Xaml page.
You now have a basic Xamarin.Forms app. Click the Play button to try it out.
Create a project in Firebase
In this step, create a project in Firebase. Go to the following link.
https://console.firebase.google.com/
Click "Add Project".
Now, Give the project name and select your country then Read the terms. Afterward, click "Create project".
Now, your project is ready, click continue.
In this step Choose Storage under the Project Overview.
Now, you will change the following Storage Rules Afterward, click "Publish".
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
service firebase.storage { | |
match /b/{bucket}/o { | |
match /{allPaths=**} { | |
allow read, write: if request.auth == null; | |
} | |
} | |
} |
Now, your Firebase Storage ready. you can use your Storage API URI here.
Setting up the User Interface
Go to MainPage.Xaml and write the following code.
MainPage.xaml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8" ?> | |
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" | |
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" | |
xmlns:local="clr-namespace:XamarinFirebase" | |
x:Class="XamarinFirebase.MainPage"> | |
<StackLayout> | |
<StackLayout> | |
<StackLayout HorizontalOptions="Center" VerticalOptions="Start"> | |
<Image x:Name="imgBanner" Source="banner.png" ></Image> | |
<Image Margin="0,0,0,10" HeightRequest="100" Source="firebase.png" ></Image> | |
<Label Margin="0,0,0,10" Text="Firebase Storage" FontAttributes="Bold" FontSize="Large" TextColor="Gray" HorizontalTextAlignment="Center" ></Label> | |
<Image x:Name="imgChoosed" HeightRequest="150"></Image> | |
<Entry x:Name="txtFileName" Placeholder="Enter FileName"></Entry> | |
<StackLayout HorizontalOptions="CenterAndExpand" Orientation="Horizontal"> | |
<Button x:Name="btnPick" WidthRequest="200" Text="Pick" Clicked="BtnPick_Clicked"/> | |
<Button x:Name="btnUpload" WidthRequest="200" Text="Upload" Clicked="BtnUpload_Clicked" /> | |
</StackLayout> | |
<StackLayout HorizontalOptions="CenterAndExpand" Orientation="Horizontal"> | |
<Button x:Name="btnDownload" WidthRequest="200" Text="Download" Clicked="BtnDownload_Clicked" /> | |
<Button x:Name="btnDelete" WidthRequest="200" Text="Delete" Clicked="BtnDelete_Clicked" /> | |
</StackLayout> | |
<Label x:Name="lblPath"></Label> | |
</StackLayout> | |
</StackLayout> | |
</StackLayout> | |
</ContentPage> |
Click the Play button to try it out.
NuGet Packages
Now, add the following NuGet Packages.
- Xam.Plugin.Media
- Firebase.Storage
Add FirebaseDatabase.net NuGet
Go to Solution Explorer and select your solution. Right-click and select "Manage NuGet Packages for Solution". Search "FirebaseDatabase.net" and add Package. Remember to install it for each project (.NET Standard, Android, iO, and UWP).
Connect Firebase
Now, Write the following code Connect your Firebase Storage
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Firebase.Storage; | |
FirebaseStorage firebaseStorage = new FirebaseStorage("xamarinfirebase-****.appspot.com"); |
Upload
Now, write the code to upload file to Firebase Storage.
FirebaseStorageHelper.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public async Task<string> UploadFile(Stream fileStream,string fileName) | |
{ | |
var imageUrl = await firebaseStorage | |
.Child("XamarinMonkeys") | |
.Child(fileName) | |
.PutAsync(fileStream); | |
return imageUrl; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
FirebaseStorageHelper firebaseStorageHelper = new FirebaseStorageHelper(); | |
MediaFile file; | |
public MainPage() | |
{ | |
InitializeComponent(); | |
} | |
protected async override void OnAppearing() | |
{ | |
base.OnAppearing(); | |
} | |
private async void BtnPick_Clicked(object sender, EventArgs e) | |
{ | |
await CrossMedia.Current.Initialize(); | |
try | |
{ | |
file = await Plugin.Media.CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions | |
{ | |
PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium | |
}); | |
if (file == null) | |
return; | |
imgChoosed.Source = ImageSource.FromStream(() => | |
{ | |
var imageStram = file.GetStream(); | |
return imageStram; | |
}); | |
} | |
catch (Exception ex) | |
{ | |
Debug.WriteLine(ex.Message); | |
} | |
} | |
private async void BtnUpload_Clicked(object sender, EventArgs e) | |
{ | |
await firebaseStorageHelper.UploadFile(file.GetStream(), Path.GetFileName(file.Path)); | |
} |
Download
Now, write the following code to download file from firebase Storage.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public async Task<string> GetFile(string fileName) | |
{ | |
return await firebaseStorage | |
.Child("XamarinMonkeys") | |
.Child(fileName) | |
.GetDownloadUrlAsync(); | |
} | |
private async void BtnDownload_Clicked(object sender, EventArgs e) | |
{ | |
string path = await firebaseStorageHelper.GetFile(txtFileName.Text); | |
if (path != null) | |
{ | |
lblPath.Text = path; | |
await DisplayAlert("Success", path, "OK"); | |
} | |
} |
Delete
Now, write the following code to Delete file from firebase storage.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public async Task DeleteFile(string fileName) | |
{ | |
await firebaseStorage | |
.Child("XamarinMonkeys") | |
.Child(fileName) | |
.DeleteAsync(); | |
} | |
private async void BtnDelete_Clicked(object sender, EventArgs e) | |
{ | |
await firebaseStorageHelper.DeleteFile(txtFileName.Text); | |
lblPath.Text = string.Empty; | |
await DisplayAlert("Success", "Deleted", "OK"); | |
} |
Full code
FirebaseStorageHelper.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Threading.Tasks; | |
using Firebase.Storage; | |
namespace XamarinFirebase.Helper | |
{ | |
public class FirebaseStorageHelper | |
{ | |
FirebaseStorage firebaseStorage = new FirebaseStorage("xamarinfirebase-****.appspot.com"); | |
public async Task<string> UploadFile(Stream fileStream,string fileName) | |
{ | |
var imageUrl = await firebaseStorage | |
.Child("XamarinMonkeys") | |
.Child(fileName) | |
.PutAsync(fileStream); | |
return imageUrl; | |
} | |
public async Task<string> GetFile(string fileName) | |
{ | |
return await firebaseStorage | |
.Child("XamarinMonkeys") | |
.Child(fileName) | |
.GetDownloadUrlAsync(); | |
} | |
public async Task DeleteFile(string fileName) | |
{ | |
await firebaseStorage | |
.Child("XamarinMonkeys") | |
.Child(fileName) | |
.DeleteAsync(); | |
} | |
} | |
} |
MainPage.Xaml.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using XamarinFirebase.Helper; | |
using XamarinFirebase.Model; | |
using Plugin.Media; | |
using Plugin.Media.Abstractions; | |
using System.Diagnostics; | |
using System.IO; | |
namespace XamarinFirebase | |
{ | |
public partial class MainPage : ContentPage | |
{ | |
FirebaseStorageHelper firebaseStorageHelper = new FirebaseStorageHelper(); | |
MediaFile file; | |
public MainPage() | |
{ | |
InitializeComponent(); | |
} | |
protected async override void OnAppearing() | |
{ | |
base.OnAppearing(); | |
} | |
private async void BtnPick_Clicked(object sender, EventArgs e) | |
{ | |
await CrossMedia.Current.Initialize(); | |
try | |
{ | |
file = await Plugin.Media.CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions | |
{ | |
PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium | |
}); | |
if (file == null) | |
return; | |
imgChoosed.Source = ImageSource.FromStream(() => | |
{ | |
var imageStram = file.GetStream(); | |
return imageStram; | |
}); | |
} | |
catch (Exception ex) | |
{ | |
Debug.WriteLine(ex.Message); | |
} | |
} | |
private async void BtnUpload_Clicked(object sender, EventArgs e) | |
{ | |
await firebaseStorageHelper.UploadFile(file.GetStream(), Path.GetFileName(file.Path)); | |
} | |
private async void BtnDelete_Clicked(object sender, EventArgs e) | |
{ | |
await firebaseStorageHelper.DeleteFile(txtFileName.Text); | |
lblPath.Text = string.Empty; | |
await DisplayAlert("Success", "Deleted", "OK"); | |
} | |
private async void BtnDownload_Clicked(object sender, EventArgs e) | |
{ | |
string path = await firebaseStorageHelper.GetFile(txtFileName.Text); | |
if (path != null) | |
{ | |
lblPath.Text = path; | |
await DisplayAlert("Success", path, "OK"); | |
} | |
} | |
} | |
} |
I hope you have understood, how to Upload, Download and Delete file using Firebase Storage in Xamarin.Forms. Thanks for reading. Please share your comments and feedback.
Happy Coding :)