Ang Firebase Storage ay isang cloud service para sa pag-iimbak ng mga file ng gumagamit, bahagi ng Firebase ecosystem mula sa Google, na idinisenyo para sa pag-upload at pag-download ng mga larawan, video, audio at iba pang binary data mula sa mobile at web application. Hindi tulad ng ordinaryong cloud disk, ang Storage ay nagsasama sa Firebase Authentication at Security Rules, na nagpapahintulot ng flexible na paghihiwalay ng access sa bawat file sa antas ng request. Ayon sa Google Firebase (2026), ang serbisyo ay nagpoproseso ng higit sa 500 milyong file operations araw-araw, na nagbibigay ng nasusukat na imbakan nang hindi kinakailangang pamahalaan ang server infrastructure.
Mga Pangunahing Punto
Firebase Storage ay isang cloud object storage na binuo sa ibabaw ng Google Cloud Storage na nagbibigay ng SDK para sa Android, iOS at web platform. Ang bawat file ay naka-imbak bilang isang object sa Google Cloud bucket at ina-access sa pamamagitan ng isang path na kahawig ng file system: gs://bucket-name/path/to/file.jpg. Ang laki ng isang file ay maaaring umabot ng hanggang 5 TB, na nagpapahintulot ng pag-iimbak ng anumang media data nang walang paunang compression.
Ang arkitektura ng Firebase Storage ay gumagamit ng reference model ng mga link (gsutil references), hindi ang klasikong hierarchy ng folder, kahit na ang SDK ay nagbibigay ng interface na may mga direktoryo para sa kaginhawahan ng developer. Pisikal, lahat ng object ay naka-imbak sa flat na namespace ng bucket, at ang mga virtual na folder ay nilikha gamit ang mga prefix ng path. Tinitiyak nito ang linear na pagganap ng paghahanap anuman ang bilang ng mga file.
Ang pangunahing bentahe ng Firebase Storage kumpara sa direktang paggamit ng Google Cloud Storage ay ang built-in na integrasyon sa Firebase Authentication at Security Rules. Ang developer ay hindi kailangang mag-set up ng mga hiwalay na IAM role at service account: ang mga patakaran ng access ay isinusulat sa isang declarative na wika na katulad ng Firebase Realtime Database Rules at awtomatikong inilalapat sa bawat request.
Ang Firebase Storage bucket ay awtomatikong nilikha kapag ina-activate ang serbisyo sa Firebase console. Ang path sa file ay binuo ayon sa prinsipyong /pangalan_folder/pangalan_file at maaaring maglaman ng mga nested na antas. Inirerekomenda na ayusin ang mga path ayon sa scheme /users/{userId}/images/{imageId}.jpg para sa paghihiwalay ng data sa pagitan ng mga gumagamit. Ang ganitong istraktura ay nagpapadali sa pagsulat ng mga panuntunan sa seguridad dahil ang path ay naglalaman ng pagkakakilanlan ng may-ari.
Mahalagang maunawaan na ang Firebase Storage ay hindi isang relational database o file server sa klasikong kahulugan. Ito ay isang object storage na na-optimize para sa pagbasa at pagsulat ng buong file. Ang pag-update ng bahagi ng file ay hindi posible: sa paulit-ulit na pag-upload na may parehong path, ang lumang object ay napapalitan ng bago. Para sa pag-iimbak ng maliit na structured data, gamitin ang Firebase Realtime Database o Cloud Firestore.
Ang pagpepresyo ng Firebase Storage ay nakadepende sa dami ng naka-imbak na data at bilang ng mga operasyon. Ang libreng plano (Spark) ay may kasamang 5 GB na imbakan, 20,000 write operations at 50,000 read operations bawat araw. Ang bayad na plano (Blaze) ay binabayaran batay sa aktwal na paggamit: $0.026 bawat GB ng naka-imbak na data, $0.05 bawat 10,000 write operations at $0.004 bawat 10,000 read operations. Karagdagang bayad ang sinisingil para sa papalabas na trapiko.
Para sa karamihan ng mga mobile application na may ilang libong gumagamit, ang libreng limitasyon ay sapat sa yugto ng prototyping at pagsubok. Kapag nag-scale sa daan-daang libong gumagamit, ang mga gastos sa Storage ay bihirang lumampas sa $50–$100 bawat buwan na may na-optimize na diskarte sa pag-upload at caching sa panig ng client.
Ang pag-upload ng file sa Firebase Storage ay ginagawa sa pamamagitan ng kaukulang SDK method na tumatanggap ng path sa storage at data ng file (byte array, URI, stream o Bitmap). Awtomatikong pinamamahalaan ng SDK ang koneksyon, hinahati ang file sa mga bahagi para sa malaking sukat at nagbibigay ng mga callback para sa pagsubaybay ng progreso. Ang pag-upload ay ginagawa nang direkta mula sa client device patungo sa Google Cloud, na lumalampas sa iyong server, na nagbabawas ng karga sa iyong sariling imprastraktura.
Para sa Android, ang Firebase Storage SDK ay gumagamit ng mga klase na StorageReference at UploadTask. Ang StorageReference ay nilikha mula sa root path sa pamamagitan ng Firebase.storage.reference at tumuturo sa isang partikular na file sa bucket. Ang UploadTask ay nagbabalik ng mga tagapakinig para sa progreso, pag-pause at pagkumpleto. Kapag naputol ang koneksyon, awtomatikong ipagpapatuloy ng UploadTask ang pag-upload mula sa huling matagumpay na nailipat na byte — ang pag-uugaling ito ay tinatawag na resumable upload.
Ang metadata ng file (Content-Type, custom field) ay inihahatid sa pamamagitan ng isang hiwalay na SettableMetadata object sa pagsisimula ng pag-upload. Ang tamang pagtatakda ng Content-Type ay kritikal para sa tamang pagpapakita ng mga file sa browser at paggana ng CDN caching. Sinusuportahan ng Firebase Storage ang lahat ng standard na MIME types: image/jpeg, image/png, video/mp4, application/pdf at iba pa.
Ang metadata ng file ay naglalaman ng mga system field (Content-Type, Cache-Control, Content-Disposition) at custom na key-value pairs (customMetadata). Ang mga system field ay namamahala ng HTTP headers sa pag-download. Halimbawa, ang Cache-Control: public, max-age=31536000 ay nagpapagana ng caching ng response sa isang taon, na makabuluhang nagbabawas ng bilang ng mga paulit-ulit na pag-download ng parehong file at nakakatipid ng trapiko.
Ang custom na metadata ay maginhawa para sa pagpapadala ng karagdagang impormasyon tungkol sa file nang hindi gumagawa ng hiwalay na koleksyon sa Firestore. Halimbawa, sa field na uploadedBy maaari mong i-save ang userId ng gumagamit na nag-upload ng file, na nagpapadali sa pagpapatupad ng mga gallery na may nilalaman ng may-akda. Ang custom na metadata ay hindi hiwalay na protektado ng Security Rules — ang access sa mga ito ay pinamamahalaan ng parehong mga patakaran tulad ng sa file mismo.
Kapag kailangan mag-upload ng maraming file nang sabay-sabay (halimbawa, mga larawan mula sa gallery), hindi inirerekomenda na magpatakbo ng mga independiyenteng UploadTask nang parallel nang walang limitasyon. Sa mga mobile device, ang parallel na pag-upload ng higit sa 3–5 na file ay humahantong sa sobrang karga ng network stack at time-out. Ang optimal na diskarte ay ang paggamit ng concurrent limit na 3 o sequential na pag-upload na may pagpapakita ng pangkalahatang progress bar.
Para sa server-side processing pagkatapos ng pag-upload (pagbuo ng thumbnail, compression, moderation ng nilalaman), gamitin ang Firebase Cloud Functions trigger: functions.storage.object().onFinalize(). Ang function na ito ay awtomatikong tinatawag pagkatapos makumpleto ang pag-upload ng bawat file at maaaring mag-save ng processed copy sa ibang path. Higit pa tungkol dito sa seksyon ng mga karaniwang sitwasyon.
Firebase Storage ay sumusuporta sa dalawang paraan ng pag-download: direktang pag-download sa pamamagitan ng SDK na may pagkuha ng byte array o lokal na file, at pagkuha ng direktang download URL para sa access sa pamamagitan ng HTTP. Ang direktang URL ay maaaring gamitin para sa pagpapakita ng mga larawan sa ImageView, sa WebView o para sa pagbibigay ng link sa gumagamit. Ang download URL ay nabuo na may security token na maaaring bawiin sa Firebase console.
Ang method na storageReference.downloadUrl ay nagbabalik ng URL sa anyong https://firebasestorage.googleapis.com/v0/b/{bucket}/o/{path}?alt=media&token={token}. Ang security token ay awtomatikong kasama sa URL sa pagbuo, kaya ang link ay maaaring ibahagi sa mga third party (halimbawa, sa messenger) nang walang panganib ng hindi awtorisadong pag-access. Gayunpaman, kung ang token ay nakompromiso, maaari itong bawiin sa pamamagitan ng Firebase console sa seksyong Storage — pagkatapos nito, lahat ng link na may token na ito ay hihinto sa paggana.
Para sa caching ng mga na-download na file sa client, gumamit ng lokal na storage at ETag o MD5 hash mechanism. Ang Firebase Storage ay nagbabalik ng HTTP ETag header kapag humihiling ng file, na maaaring ihambing sa lokal na naka-save na halaga upang maiwasan ang paulit-ulit na pag-download ng mga hindi nabagong file. Ito ay lalong kapaki-pakinabang para sa media content: mga avatar, cover, preview — mga file na bihirang i-update ngunit madalas na hinihiling.
Ang download URL na may token ay ang pangunahing paraan ng pagbibigay ng access sa mga file para sa hindi na-authenticate na mga gumagamit (halimbawa, para sa pagpapakita ng larawan sa news feed). Ang token ay nabuo nang isang beses at hindi nagbabago hanggang sa pagbawi, kaya ang URL ay maaaring i-save sa database (halimbawa, sa tabi ng field na avatarUrl sa Firestore). Kapag nagpalit ng avatar, ang lumang file ay tatanggalin, at ang bagong URL ay bubuo at ise-save.
Mahalagang tandaan: ang pagkakaroon ng download URL ay hindi nagpapawalang-bisa sa Security Rules. Kung ang panuntunan ay nagbabawal sa pagbabasa ng file, ang method na downloadUrl ay magbabalik ng Permission Denied error. Nangangahulugan ito na kahit na alam ang tamang path sa file, ang hindi na-authenticate na client ay hindi makakakuha ng link. Pagkatapos makuha ang URL, ang access sa file ay ginagawa sa pamamagitan ng HTTP, na lumalampas sa Security Rules — kaya ang token ay ang tanging proteksyon ng download link.
Ang HTTP ETag ay isang identifier ng bersyon ng file na nagbabago sa bawat pagbabago ng nilalaman. Awtomatikong nagbabalik ang Firebase Storage ng ETag sa response sa GET request. Ang client application ay maaaring mag-save ng ETag sa lokal na cache at sa paulit-ulit na request ay magpadala ng header na If-None-Match: {etag}. Kung ang file ay hindi nagbago, ang server ay magbabalik ng status na 304 Not Modified nang hindi naglilipat ng data.
Para sa pagpapatupad ng intelligent caching sa mobile application, gumamit ng kombinasyon ng lokal na file system at database (halimbawa, Room para sa pag-iimbak ng path-ETag pairs). Sa pag-download ng file, suriin ang ETag mula sa database: kung tugma ito sa server, gamitin ang lokal na kopya. Ang ganitong diskarte ay nagbabawas ng trapiko ng 60–80% para sa static media files at nagpapabilis ng pag-load ng mga screen na may mga gallery.
Ang Security Rules ay isang declarative na wika para sa paghihiwalay ng access sa mga file sa Firebase Storage, na isinasagawa sa server side ng Firebase. Ang bawat panuntunan ay nakatali sa path sa bucket at tumutukoy ng mga kondisyon kung saan pinapayagan ang read o write operation. Ang mga panuntunan ay sinusuri bawat request at hindi maaaring lampasan ng client code. Ito ang tanging linya ng depensa ng data laban sa hindi awtorisadong pag-access.
Ang batayang panuntunan — access lamang sa mga naka-authenticate na gumagamit: allow read, write: if request.auth != null. Ang ganitong panuntunan ay ginagarantiyahan na ang mga naka-log in na gumagamit lamang ang maaaring magbasa at magsulat ng mga file. Para sa mas pinong pagtatakda, ginagamit ang variable na request.auth.uid, na naglalaman ng identifier ng kasalukuyang gumagamit. Sa pamamagitan ng paghahambing ng uid sa bahagi ng path ng file, maaaring lumikha ng isolated storage para sa bawat gumagamit.
Mahalaga: Ang Security Rules ay hindi mekanismo ng validation ng nilalaman. Kung kailangan suriin ang uri ng file, laki nito o pagkakaroon ng malisyosong code, gamitin ang panuntunang request.resource, na naglalaman ng metadata ng ina-upload na file. Ang mga property na magagamit ay request.resource.size (laki ng file), request.resource.contentType (MIME type) at request.resource.md5Hash (checksum). Gayunpaman, ang buong pagsusuri ng nilalaman ay ginagawa sa server side sa pamamagitan ng Cloud Functions.
| Sitwasyon | Panuntunan ng Security Rules |
|---|---|
| Naka-authenticate lamang | allow read, write: if request.auth != null |
| May-ari lamang | allow write: if request.auth.uid == userId |
| Pampublikong pagbasa | allow read: if true; allow write: if request.auth != null |
| Limitasyon sa laki | allow write: if request.resource.size < 5 * 1024 * 1024 |
| Limitasyon sa uri | allow write: if request.resource.contentType.startsWith('image/') |
Karaniwang configuration para sa application na may mga avatar ng gumagamit at gallery ay ganito ang hitsura. Ang gumagamit ay maaari lamang sumulat sa kanyang sariling direktoryo na /users/{userId}/, ngunit maaaring magbasa ng anumang file sa direktoryong iyon (ang gallery ay pampubliko). Ang laki ng file ay limitado sa 5 MB, at ang uri — mga larawan lamang. Ang ganitong kombinasyon ng mga panuntunan ay sumasaklaw sa 80% ng mga sitwasyon ng paggamit ng Firebase Storage sa social at UGC na mga application.
Tip sa seguridad: huwag kailanman gamitin ang panuntunang allow read, write: if true para sa buong bucket. Binubuksan nito ang write access sa sinumang nakakaalam ng iyong projectId. Noong 2025, dumami ang mga pag-atake sa mga hindi protektadong Firebase bucket kung saan ginamit ng mga attacker ang bukas na access para sa pag-iimbak ng ilegal na nilalaman. Laging magsimula sa pinakamababang kinakailangang pahintulot at palawakin lamang kapag talagang kinakailangan.
Ang Cloud Functions trigger na functions.storage.object().onFinalize() ay nagpapahintulot ng validation ng nilalaman pagkatapos ng pag-upload. Kung ang file ay hindi pumasa sa validation (halimbawa, naglalaman ng virus o lumalabag sa mga panuntunan ng platform), ang function ay maaaring tanggalin ito at abisuhan ang gumagamit. Ito ang tanging paraan upang suriin ang aktwal na nilalaman dahil ang Security Rules ay nakakakita lamang ng metadata (laki at MIME type), hindi binary data.
Halimbawa ng validation: ang function sa Node.js ay nagda-download ng inupload na file sa temporary directory, pinapatakbo ito sa pamamagitan ng antivirus detector (halimbawa, ClamAV), at kung may nakitang banta — tatanggalin ang file at isusulat ang event sa Firebase Crashlytics. Ang execution time ng function ay limitado sa 540 segundo, na sapat para sa pagsusuri ng mga file hanggang 50 MB.
Tingnan natin ang mga praktikal na halimbawa ng integrasyon ng Firebase Storage sa Android application sa Kotlin. Ang code ay gumagamit ng standard na Firebase SDK classes at nagpapakita ng pag-upload ng larawan mula sa gallery ng device, pag-download ng file na may pagsubaybay sa progreso at pagkuha ng download URL. Lahat ng halimbawa ay ginawa nang may paghawak ng error at pag-pause ng mga gawain kapag nawala ang koneksyon.
Bago gamitin ang code, tiyakin na sa file na build.gradle ay idinagdag ang dependency na implementation(platform("com.google.firebase:firebase-bom:33.0.0")) at implementation("com.google.firebase:firebase-storage"). Awtomatikong pipili ang Firebase BOM ng mga compatible na bersyon ng lahat ng SDK, na nag-aalis ng mga conflict ng bersyon.
Ang unang halimbawa — pag-upload ng file na pinili ng gumagamit sa pamamagitan ng Intent ACTION_GET_CONTENT. Ang URI ng nakuha na file ay ipinapasa sa Firebase Storage SDK, na independiyenteng nagbabasa ng data mula sa URI na iyon. Ang putFile method ay tumatanggap ng URI at nagbabalik ng UploadTask — isang object kung saan maaaring subaybayan ang progreso, i-pause at ipagpatuloy ang pag-upload.
val storageRef = Firebase.storage.reference
val imageRef = storageRef.child(
"users/${auth.uid}/profile.jpg"
)
val metadata = SettableMetadata().apply {
contentType = "image/jpeg"
customMetadata = mapOf(
"uploadedBy" to auth.uid!!
)
}
imageRef.putFile(imageUri, metadata)
.addOnSuccessListener {
Log.d("Storage", "Na-upload ang file")
}
.addOnFailureListener { e ->
Log.e("Storage", "Error: ${e.message}")
}
Sa halimbawa sa itaas, ang variable na storageRef ay ang root reference sa bucket ng proyekto. Ang child method ay tumatanggap ng string ng path at nagbabalik ng StorageReference na tumuturo sa partikular na file. Kung ang file sa tinukoy na path ay mayroon na, ito ay ma-overwrite. Ang metadata na contentType at customMetadata ay inihahatid sa pamamagitan ng SettableMetadata object na nakakabit sa putFile request.
Ang ikalawang halimbawa ay nagpapakita ng pag-download ng file na may pagkuha ng byte array para sa pagpapakita sa ImageView. Ang getBytes(
val islandRef = storageRef.child("images/island.jpg")
val ONE_MEGABYTE: Long = 1024 * 1024
islandRef.getBytes(ONE_MEGABYTE)
.addOnSuccessListener { bytes ->
imageView.setImageBitmap(
BitmapFactory.decodeByteArray(
bytes, 0, bytes.size
)
)
}
.addOnFailureListener { e ->
Log.e("Storage", "Hindi na-upload: ${e.message}")
}
Para sa pagkuha ng download URL (halimbawa, upang i-save ang link sa Firestore), ginagamit ang downloadUrl method:
islandRef.downloadUrl.addOnSuccessListener { uri ->
Log.d("Storage", "Download URL: $uri")
// I-save ang uri.toString() sa Firestore
}
Tip: ang downloadUrl ay nabuo nang isang beses at matatag hanggang sa mabawi. I-save ito sa database sa unang pag-upload, huwag hilingin ito sa bawat oras kapag nagpapakita ng file. Binabawasan nito ang bilang ng mga request sa Firebase Storage at pinapabilis ang paggana ng UI.
Ang Firebase Storage ay ginagamit sa mga mobile application para sa pag-iimbak ng lahat ng user at system file. Ang pinakakaraniwang sitwasyon ay mga avatar at larawan ng profile, mga larawan sa content feed, video at audio file, mga dokumento (PDF, DOCX) para sa pagpapalitan sa pagitan ng mga gumagamit, pati na rin ang backup ng maliit na halaga ng data. Sa lahat ng kasong ito, ang Storage ay kumikilos bilang specialized file storage kasabay ng Firestore para sa pag-iimbak ng metadata at mga link.
Mga social application — ang pinakakaraniwang kaso. Bawat gumagamit ay nag-uupload ng avatar, mga larawan ng post at media file. Ang istraktura ng path na /users/{uid}/posts/{postId}/image.jpg ay nagpapahintulot ng paghihiwalay ng data at nagpapadali ng Security Rules. Kapag tinanggal ang gumagamit, ang Cloud Function ay maaaring dumaan sa lahat ng direktoryo ng gumagamit at linisin ang storage. Ayon sa Firebase blog (2025), ang pattern na ito ay ginagamit sa 70% ng production projects sa Firebase.
Mga E-commerce application ay gumagamit ng Firebase Storage para sa pag-iimbak ng mga larawan ng produkto, katalogo at PDF file na may mga tagubilin. Sa kasong ito, ang access sa mga file ay karaniwang pampubliko (pagbasa nang walang authentication), at pagsulat — para lamang sa mga administrator sa pamamagitan ng Cloud Functions na may pagsusuri ng mga karapatan. Ang download URL ng mga produkto ay naka-save sa Firestore sa tabi ng iba pang data ng produkto, na nagpapahintulot ng pagpapakita ng mga larawan nang walang karagdagang request sa Storage.
Mga Messenger at chat ay nag-iimbak sa Firebase Storage ng mga larawan at voice message na ipinadala sa mga dialog. Ang path ay binuo bilang /chats/{chatId}/messages/{messageId}.jpg. Access sa pagbasa — sa mga kalahok lamang ng chat, na sinusuri sa pamamagitan ng Security Rules gamit ang data mula sa Firestore. Ito ay isa sa ilang sitwasyon kung saan ang panuntunan ay nagbabasa ng data mula sa ibang Firebase service: allow read: if firestore.exists(/databases/(default)/documents/chats/{chatId}/members/{request.auth.uid}).
Mga Madalas Itanong
Ang Firebase Storage ay isang overlay sa ibabaw ng Google Cloud Storage na may integrasyon ng Firebase Authentication at Security Rules. Ang developer ay hindi kailangang mag-set up ng IAM roles at service account. Ang Google Cloud Storage ay nagbibigay ng mas malawak na kakayahan (mga notification ng Pub/Sub, Object Lifecycle Management), ngunit nangangailangan ng manu-manong pamamahala ng access sa pamamagitan ng GCP IAM.
Ang limitasyon sa laki ay itinakda sa Security Rules sa pamamagitan ng request.resource.size. Halimbawa: allow write: if request.resource.size <= 5 * 1024 * 1024 ay naglilimita ng mga file hanggang 5 MB. Dagdag pa, maaari mong suriin sa panig ng client bago ipadala upang hindi sayangin ang trapiko ng gumagamit sa isang file na malinaw na hindi pinapayagan.
Oo, para sa pagtanggal gamitin ang method na delete() ng StorageReference object: storageRef.child("path").delete(). Ang operasyon ng pagtanggal ay hindi na maibabalik at agad na tinatanggal ang file mula sa bucket. Maaari lamang tanggalin ang file kung pinapayagan ng Security Rules ang write para sa path na iyon. Pagkatapos ng pagtanggal, ang download URL ay hihinto sa paggana.
Sa Security Rules, payagan ang read para sa lahat (o naka-authenticate) at ipagbawal ang write: allow read: if request.auth != null; allow write: if false. Ang pagsulat sa mode na ito ay posible lamang sa pamamagitan ng service account ng Firebase Admin SDK — halimbawa, mula sa Cloud Functions na may administrative rights. Ito ay isang karaniwang pattern para sa mga katalogo ng produkto at pampublikong nilalaman.
Ang UploadTask ay gumagamit ng resumable upload protocol batay sa HTTP PUT na may segmentation. Sa pagkawala ng koneksyon, ang pag-upload ay ipagpapatuloy mula sa huling nakumpirmang byte, hindi magsisimula muli. Hindi kinakailangan ng karagdagang configuration para paganahin ang pag-uugaling ito — awtomatiko itong ginagawa ng SDK para sa mga file na mas malaki sa 1 MB.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din