Інтеграція Firebase Storage в мобільний додаток
Firebase Storage — це об'єктне сховище на базі Google Cloud Storage з інтеграцією Firebase Auth. Правила доступу пишуться тією ж мовою, що й Firestore Rules, шлях до файлу можна прив'язати до auth.uid. Для завантаження аватарів, документів, аудіо та відео з мобільного додатку — стандартний вибір у Firebase-стеку.
Завантаження файлу з прогресом
import storage from '@react-native-firebase/storage';
import { launchImageLibrary } from 'react-native-image-picker';
const uploadAvatar = async (userId: string) => {
const result = await launchImageLibrary({ mediaType: 'photo', quality: 0.8 });
if (result.didCancel || !result.assets?.[0]?.uri) return;
const localUri = result.assets[0].uri;
const ref = storage().ref(`avatars/${userId}.jpg`);
const task = ref.putFile(localUri);
task.on('state_changed',
snapshot => {
const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
setUploadProgress(Math.round(progress));
},
error => {
console.error('Upload error:', error.code);
},
async () => {
const downloadURL = await ref.getDownloadURL();
await updateUserProfile({ photoURL: downloadURL });
}
);
};
putFile() приймає локальний шлях (file://...), а не base64. На iOS launchImageLibrary повертає ph:// URI — на деяких версіях RN потрібна конвертація в file:// через react-native-fs.
Правила безпеки Storage
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /avatars/{userId}.jpg {
allow read: if request.auth != null;
allow write: if request.auth.uid == userId
&& request.resource.size < 5 * 1024 * 1024 // 5 MB
&& request.resource.contentType.matches('image/.*');
}
match /documents/{userId}/{allPaths=**} {
allow read, write: if request.auth.uid == userId;
}
}
}
request.resource.size та request.resource.contentType — перевірки на сервері, а не тільки client-side валідація.
Resumable uploads для великих файлів
putFile() автоматично використовує resumable upload для файлів >5 МБ. Для явного управління паузою/відновленням:
const task = ref.putFile(localPath);
// Пауза при уході в фон
AppState.addEventListener('change', state => {
if (state === 'background') task.pause();
if (state === 'active') task.resume();
});
Firebase Storage задача переживає перезапуск додатку тільки якщо зберегти task.snapshot.ref.fullPath та викликати ref.putResumable() при наступному запуску. Без цього при крешу завантаження почнеться заново.
Оцінка
Firebase Storage з завантаженням медіа, progress-індикатором та правилами доступу: 1–2 тижні.







