Firebase Storage: τι είναι, μεταφόρτωση αρχείων και αποθήκευση στο cloud

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-04-28 Χρόνος ανάγνωσης: 14 λεπ

Το Firebase Storage είναι μια υπηρεσία cloud αποθήκευσης αρχείων χρηστών, μέρος του οικοσυστήματος Firebase της Google, σχεδιασμένη για μεταφόρτωση και λήψη εικόνων, βίντεο, ήχου και άλλων δυαδικών δεδομένων από εφαρμογές κινητών και web. Σε αντίθεση με έναν συνηθισμένο cloud δίσκο, το Storage ενσωματώνεται με το Firebase Authentication και τους Security Rules, επιτρέποντας ευέλικτο διαχωρισμό πρόσβασης σε κάθε αρχείο σε επίπεδο αιτήματος. Σύμφωνα με το Google Firebase (2026), η υπηρεσία επεξεργάζεται περισσότερες από 500 εκατομμύρια λειτουργίες αρχείων καθημερινά, παρέχοντας κλιμακούμενη αποθήκευση χωρίς την ανάγκη διαχείρισης υποδομής διακομιστή.

Κύρια Σημεία

  • Firebase Storage — αποθήκευση cloud για αρχεία εφαρμογής με ενσωμάτωση στην πλατφόρμα Firebase.
  • Μεταφόρτωση γίνεται απευθείας από τον πελάτη μέσω SDK, παρακάμπτοντας τον δικό σας διακομιστή.
  • Κανόνες ασφαλείας επιτρέπουν τον έλεγχο πρόσβασης σε κάθε αρχείο βάσει αυθεντικοποίησης και περιεχομένου.
  • Ανθεκτικότητα σε διακοπές σύνδεσης εξασφαλίζεται με αυτόματη συνέχιση από το σημείο διακοπής.
  • Ενσωμάτωση με το Cloud Functions επιτρέπει την επεξεργασία αρχείων μετά τη μεταφόρτωση.

Τι είναι το Firebase Storage και πώς είναι δομημένο

Το Firebase Storage είναι μια αποθήκευση αντικειμένων cloud βασισμένη στο Google Cloud Storage που παρέχει SDK για πλατφόρμες Android, iOS και web. Κάθε αρχείο αποθηκεύεται ως αντικείμενο σε ένα bucket Google Cloud και προσπελαύνεται μέσω μιας διαδρομής που μοιάζει με σύστημα αρχείων: gs://bucket-name/path/to/file.jpg. Το μέγεθος ενός αρχείου μπορεί να φτάσει τα 5 TB, επιτρέποντας την αποθήκευση οποιωνδήποτε δεδομένων πολυμέσων χωρίς προηγούμενη συμπίεση.

Η αρχιτεκτονική του Firebase Storage χρησιμοποιεί μοντέλο αναφοράς συνδέσμων (gsutil references), αντί για την κλασική ιεραρχία φακέλων, αν και το SDK παρέχει διεπαφή με καταλόγους για ευκολία του προγραμματιστή. Φυσικά, όλα τα αντικείμενα αποθηκεύονται σε επίπεδο χώρο ονομάτων του bucket, και οι εικονικοί φάκελοι δημιουργούνται χρησιμοποιώντας προθέματα διαδρομής. Αυτό εξασφαλίζει γραμμική απόδοση αναζήτησης ανεξάρτητα από τον αριθμό των αρχείων.

Το κύριο πλεονέκτημα του Firebase Storage σε σύγκριση με την άμεση χρήση του Google Cloud Storage είναι η ενσωματωμένη ενσωμάτωση με το Firebase Authentication και τους Security Rules. Ο προγραμματιστής δεν χρειάζεται να ρυθμίσει ξεχωριστούς ρόλους IAM και λογαριασμούς υπηρεσίας: οι κανόνες πρόσβασης γράφονται σε δηλωτική γλώσσα παρόμοια με τους Firebase Realtime Database Rules και εφαρμόζονται αυτόματα σε κάθε αίτημα.

Δομή bucket και διαδρομές αρχείων

Το bucket του Firebase Storage δημιουργείται αυτόματα κατά την ενεργοποίηση της υπηρεσίας στην κονσόλα Firebase. Η διαδρομή προς ένα αρχείο δημιουργείται βάσει της αρχής /όνομα_φακέλου/όνομα_αρχείου και μπορεί να περιέχει ένθετα επίπεδα. Συνιστάται η οργάνωση διαδρομών σύμφωνα με το σχήμα /users/{userId}/images/{imageId}.jpg για απομόνωση δεδομένων μεταξύ χρηστών. Μια τέτοια δομή απλοποιεί τη σύνταξη κανόνων ασφαλείας καθώς η διαδρομή περιέχει την ταυτότητα του ιδιοκτήτη.

Είναι σημαντικό να κατανοήσετε ότι το Firebase Storage δεν είναι μια σχεσιακή βάση δεδομένων ή διακομιστής αρχείων με την κλασική έννοια. Είναι μια αποθήκευση αντικειμένων βελτιστοποιημένη για λειτουργίες ανάγνωσης και εγγραφής ολόκληρων αρχείων. Η ενημέρωση μέρους ενός αρχείου δεν είναι δυνατή: κατά την επαναμεταφόρτωση με την ίδια διαδρομή, το παλιό αντικείμενο αντικαθίσταται από το νέο. Για αποθήκευση μικρών δομημένων δεδομένων, χρησιμοποιήστε το Firebase Realtime Database ή το Cloud Firestore.

Τιμολόγηση και όρια του Firebase Storage

Η τιμολόγηση του Firebase Storage εξαρτάται από τον όγκο των αποθηκευμένων δεδομένων και τον αριθμό των λειτουργιών. Το δωρεάν πρόγραμμα (Spark) περιλαμβάνει 5 GB αποθήκευσης, 20.000 λειτουργίες εγγραφής και 50.000 λειτουργίες ανάγνωσης ημερησίως. Το πρόγραμμα επί πληρωμή (Blaze) χρεώνεται βάσει πραγματικής χρήσης: $0,026 ανά GB αποθηκευμένων δεδομένων, $0,05 ανά 10.000 λειτουργίες εγγραφής και $0,004 ανά 10.000 λειτουργίες ανάγνωσης. Επιπλέον χρέωση ισχύει για την εξερχόμενη κίνηση.

Για τις περισσότερες εφαρμογές κινητών με μερικές χιλιάδες χρήστες, το δωρεάν όριο είναι επαρκές στο στάδιο δημιουργίας πρωτοτύπων και δοκιμών. Κατά την κλιμάκωση σε εκατοντάδες χιλιάδες χρήστες, τα έξοδα Storage σπάνια υπερβαίνουν τα $50–$100 μηνιαίως με βελτιστοποιημένη προσέγγιση στη μεταφόρτωση και προσωρινή αποθήκευση από την πλευρά του πελάτη.

Πώς να μεταφορτώνετε αρχεία στο Firebase Storage

Η μεταφόρτωση αρχείου στο Firebase Storage γίνεται μέσω της αντίστοιχης μεθόδου SDK που δέχεται τη διαδρομή αποθήκευσης και τα δεδομένα αρχείου (πίνακας byte, URI, ροή ή Bitmap). Το SDK διαχειρίζεται αυτόματα τη σύνδεση, τεμαχίζει το αρχείο σε τμήματα για μεγάλο μέγεθος και παρέχει callbacks για παρακολούθηση προόδου. Η μεταφόρτωση γίνεται απευθείας από τη συσκευή πελάτη στο Google Cloud, παρακάμπτοντας τον διακομιστή σας, μειώνοντας το φορτίο στη δική σας υποδομή.

Για Android, το Firebase Storage SDK χρησιμοποιεί τις κλάσεις StorageReference και UploadTask. Η StorageReference δημιουργείται από τη ρίζα διαδρομής μέσω του Firebase.storage.reference και δείχνει σε ένα συγκεκριμένο αρχείο στο bucket. Το UploadTask επιστρέφει ακροατές για πρόοδο, παύση και ολοκλήρωση. Κατά τη διακοπή σύνδεσης, το UploadTask συνεχίζει αυτόματα τη μεταφόρτωση από το τελευταίο επιτυχώς μεταφερθέν byte — αυτή η συμπεριφορά ονομάζεται επαναληπτική μεταφόρτωση (resumable upload).

Τα μεταδεδομένα αρχείου (Content-Type, προσαρμοσμένα πεδία) μεταδίδονται μέσω ενός ξεχωριστού αντικειμένου SettableMetadata κατά την έναρξη της μεταφόρτωσης. Η σωστή ρύθμιση του Content-Type είναι κρίσιμη για τη σωστή εμφάνιση αρχείων στο πρόγραμμα περιήγησης και τη λειτουργία της προσωρινής αποθήκευσης CDN. Το Firebase Storage υποστηρίζει όλους τους τυπικούς τύπους MIME: image/jpeg, image/png, video/mp4, application/pdf και άλλους.

Διαχείριση μεταδεδομένων κατά τη μεταφόρτωση

Τα μεταδεδομένα αρχείου περιέχουν πεδία συστήματος (Content-Type, Cache-Control, Content-Disposition) και προσαρμοσμένα ζεύγη κλειδιού-τιμής (customMetadata). Τα πεδία συστήματος διαχειρίζονται τις κεφαλίδες HTTP κατά τη λήψη. Για παράδειγμα, το Cache-Control: public, max-age=31536000 ενεργοποιεί την προσωρινή αποθήκευση της απάντησης για ένα έτος, μειώνοντας σημαντικά τον αριθμό των επαναλαμβανόμενων λήψεων του ίδιου αρχείου και εξοικονομώντας κίνηση.

Τα προσαρμοσμένα μεταδεδομένα είναι βολικά για τη μετάδοση πρόσθετων πληροφοριών σχετικά με το αρχείο χωρίς τη δημιουργία ξεχωριστής συλλογής στο Firestore. Για παράδειγμα, στο πεδίο uploadedBy μπορείτε να αποθηκεύσετε το userId του χρήστη που μεταφόρτωσε το αρχείο, απλοποιώντας την υλοποίηση γκαλερί με περιεχόμενο δημιουργού. Τα προσαρμοσμένα μεταδεδομένα δεν προστατεύονται ξεχωριστά από τους Security Rules — η πρόσβαση σε αυτά ρυθμίζεται από τους ίδιους κανόνες με το ίδιο το αρχείο.

Πολλαπλή μεταφόρτωση και μαζική επεξεργασία

Όταν χρειάζεται να μεταφορτώσετε πολλά αρχεία ταυτόχρονα (για παράδειγμα, φωτογραφίες από γκαλερί), δεν συνιστάται η εκτέλεση ανεξάρτητων UploadTask παράλληλα χωρίς περιορισμούς. Σε κινητές συσκευές, η παράλληλη μεταφόρτωση περισσότερων από 3–5 αρχείων οδηγεί σε υπερφόρτωση της στοίβας δικτύου και χρονικές υπερβάσεις. Η βέλτιστη στρατηγική είναι η χρήση ορίου ταυτοχρονισμού 3 ή η σειριακή μεταφόρτωση με εμφάνιση γενικής γραμμής προόδου.

Για επεξεργασία από την πλευρά του διακομιστή μετά τη μεταφόρτωση (δημιουργία μικρογραφιών, συμπίεση, μετριασμός περιεχομένου), χρησιμοποιήστε το trigger του Firebase Cloud Functions: functions.storage.object().onFinalize(). Αυτή η συνάρτηση καλείται αυτόματα μετά την ολοκλήρωση της μεταφόρτωσης κάθε αρχείου και μπορεί να αποθηκεύσει ένα επεξεργασμένο αντίγραφο σε διαφορετική διαδρομή. Περισσότερα για αυτό στην ενότητα των τυπικών σεναρίων.

Λήψη αρχείων και διαχείριση συνδέσμων

Το Firebase Storage υποστηρίζει δύο τρόπους λήψης: άμεση λήψη μέσω SDK με λήψη πίνακα byte ή τοπικού αρχείου, και λήψη άμεσου download URL για πρόσβαση μέσω HTTP. Το άμεσο URL μπορεί να χρησιμοποιηθεί για εμφάνιση εικόνων σε ImageView, σε WebView ή για παροχή συνδέσμου στον χρήστη. Το download URL δημιουργείται με κωδικό ασφαλείας που μπορεί να ανακληθεί στην κονσόλα Firebase.

Η μέθοδος storageReference.downloadUrl επιστρέφει ένα URL της μορφής https://firebasestorage.googleapis.com/v0/b/{bucket}/o/{path}?alt=media&token={token}. Ο κωδικός ασφαλείας συμπεριλαμβάνεται αυτόματα στο URL κατά τη δημιουργία, επομένως ο σύνδεσμος μπορεί να μεταδοθεί σε τρίτους (για παράδειγμα, σε messenger) χωρίς κίνδυνο μη εξουσιοδοτημένης πρόσβασης. Ωστόσο, εάν ο κωδικός έχει παραβιαστεί, μπορεί να ανακληθεί μέσω της κονσόλας Firebase στην ενότητα Storage — μετά από αυτό, όλοι οι σύνδεσμοι με αυτόν τον κωδικό παύουν να λειτουργούν.

Για προσωρινή αποθήκευση ληφθέντων αρχείων στον πελάτη, χρησιμοποιήστε τοπικό χώρο αποθήκευσης και μηχανισμό ETag ή MD5 hash. Το Firebase Storage επιστρέφει κεφαλίδα HTTP ETag κατά την αίτηση αρχείου, η οποία μπορεί να συγκριθεί με μια τοπικά αποθηκευμένη τιμή για αποφυγή επαναλαμβανόμενης λήψης αμετάβλητων αρχείων. Αυτό είναι ιδιαίτερα χρήσιμο για περιεχόμενο πολυμέσων: avatars, εξώφυλλα, προεπισκοπήσεις — αρχεία που σπάνια ενημερώνονται αλλά ζητούνται συχνά.

Άμεσα download URL και ασφάλειά τους

Το download URL με κωδικό είναι ο κύριος τρόπος παροχής πρόσβασης σε αρχεία για μη αυθεντικοποιημένους χρήστες (για παράδειγμα, για εμφάνιση εικόνας σε ροή ειδήσεων). Ο κωδικός δημιουργείται μία φορά και δεν αλλάζει μέχρι την ανάκληση, επομένως το URL μπορεί να αποθηκευτεί στη βάση δεδομένων (για παράδειγμα, δίπλα στο πεδίο avatarUrl στο Firestore). Κατά την αλλαγή avatar, το παλιό αρχείο διαγράφεται και το νέο URL δημιουργείται και αποθηκεύεται.

Είναι σημαντικό να θυμάστε: η ύπαρξη download URL δεν ακυρώνει τους Security Rules. Εάν ένας κανόνας απαγορεύει την ανάγνωση του αρχείου, η μέθοδος downloadUrl θα επιστρέψει σφάλμα Permission Denied. Αυτό σημαίνει ότι ακόμη και γνωρίζοντας τη σωστή διαδρομή προς το αρχείο, ένας μη αυθεντικοποιημένος πελάτης δεν μπορεί να λάβει τον σύνδεσμο. Μετά τη λήψη του URL, η πρόσβαση στο αρχείο γίνεται μέσω HTTP, παρακάμπτοντας τους Security Rules — επομένως ο κωδικός είναι η μόνη προστασία του download συνδέσμου.

Προσωρινή αποθήκευση και εργασία με ETag

Το HTTP ETag είναι ένα αναγνωριστικό έκδοσης αρχείου που αλλάζει με κάθε αλλαγή περιεχομένου. Το Firebase Storage επιστρέφει αυτόματα ETag στην απάντηση σε αίτημα GET. Η εφαρμογή πελάτη μπορεί να αποθηκεύσει το ETag στην τοπική κρυφή μνήμη και σε επαναλαμβανόμενο αίτημα να στείλει την κεφαλίδα If-None-Match: {etag}. Εάν το αρχείο δεν έχει αλλάξει, ο διακομιστής επιστρέφει κατάσταση 304 Not Modified χωρίς μεταφορά δεδομένων.

Για την υλοποίηση έξυπνης προσωρινής αποθήκευσης σε εφαρμογή κινητού, χρησιμοποιήστε συνδυασμό τοπικού συστήματος αρχείων και βάσης δεδομένων (για παράδειγμα, Room για αποθήκευση ζευγών διαδρομής-ETag). Κατά τη λήψη αρχείου, ελέγξτε το ETag από τη βάση δεδομένων: εάν ταιριάζει με την τιμή του διακομιστή, χρησιμοποιήστε το τοπικό αντίγραφο. Αυτή η προσέγγιση μειώνει την κίνηση κατά 60–80% για στατικά αρχεία πολυμέσων και επιταχύνει τη φόρτωση οθονών με γκαλερί.

Κανόνες ασφαλείας για το Firebase Storage

Οι Security Rules είναι μια δηλωτική γλώσσα για τον διαχωρισμό πρόσβασης σε αρχεία στο Firebase Storage, που εκτελείται στην πλευρά του διακομιστή Firebase. Κάθε κανόνας συνδέεται με μια διαδρομή στο bucket και καθορίζει τις συνθήκες υπό τις οποίες επιτρέπεται η λειτουργία ανάγνωσης (read) ή εγγραφής (write). Οι κανόνες ελέγχονται πριν από κάθε αίτημα και δεν μπορούν να παρακαμφθούν από κώδικα πελάτη. Αυτή είναι η μοναδική γραμμή άμυνας των δεδομένων έναντι μη εξουσιοδοτημένης πρόσβασης.

Ο βασικός κανόνας — πρόσβαση μόνο σε αυθεντικοποιημένους χρήστες: allow read, write: if request.auth != null. Ένας τέτοιος κανόνας εγγυάται ότι μόνο συνδεδεμένοι χρήστες μπορούν να διαβάζουν και να γράφουν αρχεία. Για λεπτότερη ρύθμιση χρησιμοποιείται η μεταβλητή request.auth.uid, η οποία περιέχει το αναγνωριστικό του τρέχοντος χρήστη. Συγκρίνοντας το uid με μέρος της διαδρομής αρχείου, μπορεί να δημιουργηθεί απομονωμένος χώρος αποθήκευσης για κάθε χρήστη.

Σημαντικό: Οι Security Rules δεν είναι μηχανισμός επικύρωσης περιεχομένου. Εάν χρειάζεται να ελέγξετε τον τύπο αρχείου, το μέγεθός του ή την παρουσία κακόβουλου κώδικα, χρησιμοποιήστε τον κανόνα request.resource, ο οποίος περιέχει τα μεταδεδομένα του μεταφορτωμένου αρχείου. Διαθέσιμες ιδιότητες: request.resource.size (μέγεθος αρχείου), request.resource.contentType (τύπος MIME) και request.resource.md5Hash (άθροισμα ελέγχου). Ωστόσο, ο πλήρης έλεγχος περιεχομένου εκτελείται στην πλευρά του διακομιστή μέσω των Cloud Functions.

ΣενάριοΚανόνας Security Rules
Μόνο αυθεντικοποιημένοιallow read, write: if request.auth != null
Μόνο ιδιοκτήτηςallow write: if request.auth.uid == userId
Δημόσια ανάγνωσηallow read: if true; allow write: if request.auth != null
Περιορισμός μεγέθουςallow write: if request.resource.size < 5 * 1024 * 1024
Περιορισμός τύπουallow write: if request.resource.contentType.startsWith('image/')

Παράδειγμα κανόνων για περιεχόμενο χρήστη

Τυπική διαμόρφωση για εφαρμογή με avatars χρηστών και γκαλερί έχει ως εξής. Ο χρήστης μπορεί να γράφει μόνο στον δικό του κατάλογο /users/{userId}/, αλλά μπορεί να διαβάζει οποιοδήποτε αρχείο σε αυτόν τον κατάλογο (η γκαλερί είναι δημόσια). Το μέγεθος αρχείου περιορίζεται στα 5 MB και ο τύπος — μόνο εικόνες. Αυτός ο συνδυασμός κανόνων καλύπτει το 80% των σεναρίων χρήσης του Firebase Storage σε κοινωνικές και UGC εφαρμογές.

Συμβουλή ασφαλείας: ποτέ μην χρησιμοποιείτε τον κανόνα allow read, write: if true για ολόκληρο το bucket. Αυτό ανοίγει πρόσβαση εγγραφής σε οποιονδήποτε γνωρίζει το projectId σας. Το 2025 αυξήθηκαν οι επιθέσεις σε μη προστατευμένα buckets Firebase, όπου επιτιθέμενοι χρησιμοποίησαν ανοιχτή πρόσβαση για αποθήκευση παράνομου περιεχομένου. Πάντα ξεκινάτε με τα ελάχιστα απαραίτητα δικαιώματα και επεκτείνετε μόνο όταν υπάρχει ρητή ανάγκη.

Επικύρωση περιεχομένου μέσω Cloud Functions

Το Cloud Functions trigger functions.storage.object().onFinalize() επιτρέπει την επικύρωση περιεχομένου μετά τη μεταφόρτωση. Εάν το αρχείο δεν περάσει την επικύρωση (για παράδειγμα, περιέχει ιό ή παραβιάζει τους κανόνες της πλατφόρμας), η συνάρτηση μπορεί να το διαγράψει και να ειδοποιήσει τον χρήστη. Αυτός είναι ο μόνος τρόπος ελέγχου του πραγματικού περιεχομένου, καθώς οι Security Rules βλέπουν μόνο μεταδεδομένα (μέγεθος και τύπο MIME), όχι δυαδικά δεδομένα.

Παράδειγμα επικύρωσης: μια συνάρτηση σε Node.js κατεβάζει το μεταφορτωμένο αρχείο σε προσωρινό κατάλογο, το περνά μέσω ανιχνευτή ιών (για παράδειγμα, ClamAV) και εάν εντοπιστεί απειλή — διαγράφει το αρχείο και καταγράφει το συμβάν στο Firebase Crashlytics. Ο χρόνος εκτέλεσης της συνάρτησης περιορίζεται στα 540 δευτερόλεπτα, που είναι αρκετό για τον έλεγχο αρχείων έως 50 MB.

Παραδείγματα κώδικα για Firebase Storage σε Kotlin

Ας δούμε πρακτικά παραδείγματα ενσωμάτωσης του Firebase Storage σε εφαρμογή Android σε Kotlin. Ο κώδικας χρησιμοποιεί τυπικές κλάσεις Firebase SDK και παρουσιάζει τη μεταφόρτωση εικόνας από τη γκαλερί συσκευής, τη λήψη αρχείου με παρακολούθηση προόδου και τη λήψη download URL. Όλα τα παραδείγματα γίνονται με χειρισμό σφαλμάτων και παύση εργασιών κατά την απώλεια σύνδεσης.

Πριν χρησιμοποιήσετε τον κώδικα, βεβαιωθείτε ότι στο αρχείο build.gradle έχει προστεθεί η εξάρτηση implementation(platform("com.google.firebase:firebase-bom:33.0.0")) και implementation("com.google.firebase:firebase-storage"). Το Firebase BOM επιλέγει αυτόματα συμβατές εκδόσεις όλων των SDK, αποκλείοντας συγκρούσεις εκδόσεων.

Μεταφόρτωση εικόνας από γκαλερί

Το πρώτο παράδειγμα — μεταφόρτωση αρχείου που επέλεξε ο χρήστης μέσω Intent ACTION_GET_CONTENT. Το URI του ληφθέντος αρχείου μεταβιβάζεται στο Firebase Storage SDK, το οποίο διαβάζει αυτόνομα τα δεδομένα από αυτό το URI. Η μέθοδος putFile δέχεται ένα URI και επιστρέφει ένα UploadTask — ένα αντικείμενο μέσω του οποίου μπορεί να παρακολουθείται η πρόοδος, να γίνεται παύση και συνέχιση της μεταφόρτωσης.

kotlin
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", "Το αρχείο μεταφορτώθηκε")
    }
    .addOnFailureListener { e ->
        Log.e("Storage", "Σφάλμα: ${e.message}")
    }

Στο παραπάνω παράδειγμα, η μεταβλητή storageRef είναι η ρίζα αναφοράς στο bucket του έργου. Η μέθοδος child δέχεται μια συμβολοσειρά διαδρομής και επιστρέφει μια StorageReference που δείχνει σε ένα συγκεκριμένο αρχείο. Εάν το αρχείο στην καθορισμένη διαδρομή υπάρχει ήδη, θα αντικατασταθεί. Τα μεταδεδομένα contentType και customMetadata μεταδίδονται μέσω ενός αντικειμένου SettableMetadata που επισυνάπτεται στο αίτημα putFile.

Λήψη αρχείου με πρόοδο

Το δεύτερο παράδειγμα παρουσιάζει τη λήψη αρχείου με λήψη πίνακα byte για εμφάνιση σε ImageView. Η μέθοδος getBytes() φορτώνει ολόκληρο το αρχείο στη μνήμη. Για αρχεία μεγαλύτερα από 10 MB, χρησιμοποιήστε το getFile() — αποθηκεύει το περιεχόμενο απευθείας σε τοπικό αρχείο χωρίς αποθήκευση στη RAM, αποτρέποντας το OutOfMemoryError.

kotlin
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", "Αποτυχία μεταφόρτωσης: ${e.message}")
    }

Για λήψη download URL (για παράδειγμα, για αποθήκευση συνδέσμου στο Firestore), χρησιμοποιείται η μέθοδος downloadUrl:

kotlin
islandRef.downloadUrl.addOnSuccessListener { uri ->
    Log.d("Storage", "Download URL: $uri")
    // Αποθήκευση uri.toString() στο Firestore
}

Συμβουλή: το downloadUrl δημιουργείται μία φορά και είναι σταθερό μέχρι να ανακληθεί. Αποθηκεύστε το στη βάση δεδομένων κατά την πρώτη μεταφόρτωση, μην το ζητάτε κάθε φορά κατά την εμφάνιση του αρχείου. Αυτό μειώνει τον αριθμό αιτημάτων προς το Firebase Storage και επιταχύνει τη λειτουργία του UI.

Τυπικά σενάρια χρήσης του Firebase Storage

Το Firebase Storage χρησιμοποιείται σε εφαρμογές κινητών για αποθήκευση όλων των αρχείων χρηστών και συστήματος. Τα πιο συνηθισμένα σενάρια είναι avatars και φωτογραφίες προφίλ, εικόνες σε ροή περιεχομένου, αρχεία βίντεο και ήχου, έγγραφα (PDF, DOCX) για ανταλλαγή μεταξύ χρηστών, καθώς και δημιουργία αντιγράφων ασφαλείας μικρού όγκου δεδομένων. Σε όλες αυτές τις περιπτώσεις, το Storage λειτουργεί ως εξειδικευμένος χώρος αποθήκευσης αρχείων σε συνδυασμό με το Firestore για αποθήκευση μεταδεδομένων και συνδέσμων.

Κοινωνικές εφαρμογές — η πιο συνηθισμένη περίπτωση. Κάθε χρήστης μεταφορτώνει avatar, φωτογραφίες αναρτήσεων και αρχεία πολυμέσων. Η δομή διαδρομών /users/{uid}/posts/{postId}/image.jpg επιτρέπει την απομόνωση δεδομένων και απλοποιεί τους Security Rules. Κατά τη διαγραφή χρήστη, το Cloud Function μπορεί να διατρέξει όλους τους καταλόγους του χρήστη και να καθαρίσει τον χώρο αποθήκευσης. Σύμφωνα με το ιστολόγιο Firebase (2025), αυτό το μοτίβο χρησιμοποιείται στο 70% των έργων παραγωγής στο Firebase.

Εφαρμογές E-commerce χρησιμοποιούν το Firebase Storage για αποθήκευση φωτογραφιών προϊόντων, καταλόγων και αρχείων PDF με οδηγίες. Σε αυτήν την περίπτωση, η πρόσβαση στα αρχεία είναι συνήθως δημόσια (ανάγνωση χωρίς αυθεντικοποίηση) και η εγγραφή — μόνο για διαχειριστές μέσω Cloud Functions με έλεγχο δικαιωμάτων. Το download URL των προϊόντων αποθηκεύεται στο Firestore δίπλα στα υπόλοιπα δεδομένα προϊόντος, επιτρέποντας την εμφάνιση εικόνων χωρίς πρόσθετα αιτήματα στο Storage.

Messenger και συνομιλίες αποθηκεύουν στο Firebase Storage εικόνες και φωνητικά μηνύματα που αποστέλλονται σε διαλόγους. Η διαδρομή δημιουργείται ως /chats/{chatId}/messages/{messageId}.jpg. Πρόσβαση ανάγνωσης — μόνο σε συμμετέχοντες της συνομιλίας, η οποία ελέγχεται μέσω Security Rules χρησιμοποιώντας δεδομένα από το Firestore. Αυτό είναι ένα από τα λίγα σενάρια όπου ο κανόνας διαβάζει δεδομένα από άλλη υπηρεσία Firebase: allow read: if firestore.exists(/databases/(default)/documents/chats/{chatId}/members/{request.auth.uid}).

Συχνές Ερωτήσεις

Πώς διαφέρει το Firebase Storage από το Google Cloud Storage;

Το Firebase Storage είναι μια υπερδομή πάνω από το Google Cloud Storage με ενσωμάτωση Firebase Authentication και Security Rules. Ο προγραμματιστής δεν χρειάζεται να ρυθμίσει ρόλους IAM και λογαριασμούς υπηρεσίας. Το Google Cloud Storage παρέχει ευρύτερες δυνατότητες (ειδοποιήσεις Pub/Sub, Object Lifecycle Management), αλλά απαιτεί χειροκίνητη διαχείριση πρόσβασης μέσω GCP IAM.

Πώς μπορώ να περιορίσω το μέγεθος του μεταφορτωμένου αρχείου;

Ο περιορισμός μεγέθους ορίζεται στους Security Rules μέσω του request.resource.size. Παράδειγμα: allow write: if request.resource.size <= 5 * 1024 * 1024 περιορίζει τα αρχεία στα 5 MB. Επιπλέον, μπορείτε να ελέγχετε από την πλευρά του πελάτη πριν από την αποστολή για να μην σπαταλάτε την κίνηση του χρήστη σε προφανώς μη αποδεκτό αρχείο.

Μπορώ να διαγράψω ένα αρχείο μέσω του Firebase Storage SDK;

Ναι, για διαγραφή χρησιμοποιείται η μέθοδος delete() του αντικειμένου StorageReference: storageRef.child("path").delete(). Η λειτουργία διαγραφής είναι μη αναστρέψιμη και διαγράφει άμεσα το αρχείο από το bucket. Το αρχείο μπορεί να διαγραφεί μόνο εάν οι Security Rules επιτρέπουν write για αυτήν τη διαδρομή. Μετά τη διαγραφή, το download URL παύει να λειτουργεί.

Πώς μπορώ να κάνω τον χώρο αποθήκευσης μόνο για ανάγνωση;

Στους Security Rules, επιτρέψτε read για όλους (ή αυθεντικοποιημένους) και απαγορεύστε write: allow read: if request.auth != null; allow write: if false. Η εγγραφή σε αυτήν τη λειτουργία είναι δυνατή μόνο μέσω λογαριασμού υπηρεσίας του Firebase Admin SDK — για παράδειγμα, από Cloud Functions με δικαιώματα διαχειριστή. Αυτό είναι ένα τυπικό μοτίβο για καταλόγους προϊόντων και δημόσιο περιεχόμενο.

Πώς χειρίζεται το Firebase Storage τη διακοπή σύνδεσης κατά τη μεταφόρτωση;

Το UploadTask χρησιμοποιεί το πρωτόκολλο resumable upload που βασίζεται σε HTTP PUT με τμηματοποίηση. Κατά τη διακοπή, η μεταφόρτωση συνεχίζεται από το τελευταίο επιβεβαιωμένο byte, όχι από την αρχή. Δεν απαιτείται πρόσθετη διαμόρφωση για την ενεργοποίηση αυτής της συμπεριφοράς — το SDK το κάνει αυτόματα για αρχεία μεγαλύτερα από 1 MB.

Σύνοψη

  • Firebase Storage — αποθήκευση αντικειμένων cloud βασισμένη στο Google Cloud Storage με ενσωμάτωση Firebase Authentication και Security Rules.
  • Μεταφόρτωση αρχείων γίνεται απευθείας από τον πελάτη μέσω SDK με υποστήριξη resumable upload σε διακοπές σύνδεσης.
  • Λήψη είναι δυνατή μέσω SDK (πίνακας byte ή τοπικό αρχείο) ή μέσω άμεσων download URL με κωδικό ασφαλείας.
  • Security Rules — ο μοναδικός μηχανισμός προστασίας δεδομένων που επιτρέπει διαχωρισμό πρόσβασης βάσει διαδρομής, αυθεντικοποίησης, μεγέθους και τύπου αρχείου.
  • Προσωρινή αποθήκευση μέσω HTTP ETag μειώνει την κίνηση κατά 60–80% για στατικά αρχεία πολυμέσων με σωστή υλοποίηση στον πελάτη.
  • Cloud Functions trigger onFinalize επιτρέπει μετα-επεξεργασία αρχείων: συμπίεση, μετριασμό, δημιουργία προεπισκόπησης.
  • Η τιμολόγηση είναι προβλέψιμη: το δωρεάν όριο 5 GB καλύπτει πρωτότυπα, το πρόγραμμα επί πληρωμή Blaze χρεώνεται βάσει πραγματικής χρήσης.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης