
Cloud
Learning Level
Firebase Storage provides secure file storage with powerful features for uploading, downloading, and managing files in your applications.
By the end of this lesson, you'll understand:
import { getStorage, ref, uploadBytes } from "firebase/storage";
const storage = getStorage();
async function uploadFile(file, userId) {
const storageRef = ref(storage, `users/${userId}/${file.name}`);
try {
const snapshot = await uploadBytes(storageRef, file);
console.log('File uploaded:', snapshot.metadata.name);
return snapshot;
} catch (error) {
console.error('Upload error:', error);
}
}import { ref, uploadBytesResumable } from "firebase/storage";
function uploadWithProgress(file, userId, onProgress) {
const storageRef = ref(storage, `users/${userId}/${file.name}`);
const uploadTask = uploadBytesResumable(storageRef, file);
uploadTask.on(
'state_changed',
(snapshot) => {
const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
onProgress(progress);
console.log('Upload progress:', progress);
},
(error) => {
console.error('Upload error:', error);
},
() => {
console.log('Upload complete');
}
);
return uploadTask;
}import { ref, getBytes, getUrl } from "firebase/storage";
// Get download URL
async function getFileUrl(userId, fileName) {
const fileRef = ref(storage, `users/${userId}/${fileName}`);
const url = await getUrl(fileRef);
return url;
}
// Display image
async function displayImage(userId, fileName) {
const url = await getFileUrl(userId, fileName);
const img = document.createElement('img');
img.src = url;
document.body.appendChild(img);
}
// Download as bytes
async function downloadFile(userId, fileName) {
const fileRef = ref(storage, `users/${userId}/${fileName}`);
const bytes = await getBytes(fileRef);
return bytes;
}import { ref, deleteObject } from "firebase/storage";
async function deleteFile(userId, fileName) {
const fileRef = ref(storage, `users/${userId}/${fileName}`);
try {
await deleteObject(fileRef);
console.log('File deleted');
} catch (error) {
console.error('Delete error:', error);
}
}import { ref, getMetadata, updateMetadata } from "firebase/storage";
// Get metadata
async function getFileMetadata(userId, fileName) {
const fileRef = ref(storage, `users/${userId}/${fileName}`);
const metadata = await getMetadata(fileRef);
console.log('Name:', metadata.name);
console.log('Size:', metadata.size);
console.log('Type:', metadata.contentType);
console.log('Updated:', metadata.updated);
}
// Update metadata
async function updateFileMetadata(userId, fileName, customMetadata) {
const fileRef = ref(storage, `users/${userId}/${fileName}`);
await updateMetadata(fileRef, {
customMetadata: customMetadata,
cacheControl: 'public, max-age=3600'
});
}import { useState } from 'react';
import { getStorage, ref, uploadBytesResumable } from "firebase/storage";
export function FileUploadForm({ userId }) {
const [file, setFile] = useState(null);
const [progress, setProgress] = useState(0);
const [uploadedUrl, setUploadedUrl] = useState('');
const storage = getStorage();
async function handleUpload(e) {
e.preventDefault();
if (!file) return;
const storageRef = ref(storage, `users/${userId}/${file.name}`);
const uploadTask = uploadBytesResumable(storageRef, file);
uploadTask.on(
'state_changed',
(snapshot) => {
const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
setProgress(progress);
},
(error) => {
console.error('Upload error:', error);
},
async () => {
const url = await uploadTask.snapshot.ref.getDownloadURL();
setUploadedUrl(url);
}
);
}
return (
<form onSubmit={handleUpload}>
<input
type="file"
onChange={(e) => setFile(e.target.files[0])}
/>
<button type="submit">Upload</button>
{progress > 0 && <p>Progress: {progress.toFixed(2)}%</p>}
{uploadedUrl && <img src={uploadedUrl} alt="Uploaded" />}
</form>
);
}// Folder structure pattern
// users/{userId}/profile/avatar.jpg
// users/{userId}/documents/resume.pdf
// users/{userId}/photos/{photoId}.jpg
async function uploadProfilePicture(file, userId) {
const storageRef = ref(storage, `users/${userId}/profile/avatar`);
return uploadBytes(storageRef, file);
}
async function uploadDocument(file, userId, documentType) {
const storageRef = ref(storage, `users/${userId}/documents/${documentType}/${file.name}`);
return uploadBytes(storageRef, file);
}
async function uploadPhoto(file, userId, albumId) {
const fileName = `${Date.now()}_${file.name}`;
const storageRef = ref(storage, `users/${userId}/albums/${albumId}/${fileName}`);
return uploadBytes(storageRef, file);
}async function uploadMultipleFiles(files, userId) {
const uploads = files.map(file => {
const storageRef = ref(storage, `users/${userId}/files/${file.name}`);
return uploadBytes(storageRef, file);
});
try {
const results = await Promise.all(uploads);
console.log('All files uploaded:', results.length);
return results;
} catch (error) {
console.error('Batch upload error:', error);
}
}Explore Firebase Functions for advanced file processing, or implement image resizing with Cloud Functions.
Resources
Ojasa Mirai
Master AI-powered development skills through structured learning, real projects, and verified credentials. Whether you're upskilling your team or launching your career, we deliver the skills companies actually need.
Learn Deep โข Build Real โข Verify Skills โข Launch Forward