Android

Firebase, Bài 3: Giới thiệu về Cloud Storage.

Nếu bạn đã đọc qua Bài mở đầu của tôi về Firebase thì bạn đã không còn xa lạ gì về tính “bao trọn gói” của “Ngọn lửa”. Hôm nay chúng ta tiếp tục tìm hiểu khái quát về Cloud Storage, tức là dịch vụ lưu trữ tĩnh. Với Cloud Storage thì bạn có thể giảm bớt gánh nặng cho Realtime Database vốn có giới hạn thấp hơn, để lưu trữ các nội dung mang tính tĩnh hơn. Chẳng hạn, profile pictures cho các users hay một tập hợp các tập tin ZIP.

FirebaseCloudStorage1. Firebase Cloud Storage là gì?

Cloud Storage for Firebase is a powerful, simple, and cost-effective object storage service built for Google scale. The Firebase SDKs for Cloud Storage add Google security to file uploads and downloads for your Firebase apps, regardless of network quality. You can use our SDKs to store images, audio, video, or other user-generated content.

Nói ngắn gọn, Firebase Cloud Storage chính là không gian lưu trữ dữ liệu. Dữ liệu ở đây không có giới hạn nào cả. Bạn có thể chứa bất kì các (loại) tập tin nào mà bạn muốn, như ảnh, nhạc, video hoặc các tập tin text, zip hay thậm chí là một tập tin với kiểu dữ liệu của riêng bạn thiết kế. Có lẽ bạn sẽ cho rằng “Ơ nghe sao giống Google Drive vậy?” – Giống thôi, nhưng mục đích của Firebase Cloud Storage phục vụ cho hoạt động lập trình, làm nền tảng cho bạn xây dựng sản phẩm phần mềm trên đó, không phải phục vụ cho mục đích cá nhân. Trên thực tế, nó giống như không gian lưu trữ trên Web host của bạn vậy.

Đã có Realtime Database thì tại sao có Cloud Storage? Câu trả lời rất đơn giản. Realtime Database mang tính “là cơ sở dữ liệu” hơn so với Cloud Storage – vốn là nơi lưu trữ các tập tin riêng biệt. Về góc độ linh động, thì Realtime Database mang tính “động” (dynamic), tức là khi có thay đổi trên CSDL thì lập tức Firebase server sẽ gửi các Events xuống các thiết bị, còn Cloud Storage thì không. Dưới góc độ dung lượng, với gói Spark thì bạn chỉ có 1GB cho Realtime Database, trong khi có tới 5GB cho Cloud Storage.

2. Cái hay của Firebase Cloud Storage.

Cũng như Realtime Database, Authentication và các sản phẩm khác của “Ngọn lửa”, Cloud Storage có hẳn (sẵn) một bộ thư viện để bạn chỉ việc vận dụng vào các projects của mình. Bạn không cần viết bất kì một dòng code nào để làm APIs, để handle các event khi người dùng send request, upload hoặc download các tập tin tại server trừ khi điều đó là cần thiết. Và nếu bạn đang (có dự định) thao tác với Google Cloud Platform, cụ thể là Google Cloud Storage thì Firebase Cloud Storage là lựa chọn hàng đầu trong danh sách các dịch vụ mà bạn (cần) tham khảo.

3. Tích hợp Firebase Cloud Storage vào các Projects của bạn và cho upload, download, delete các files.

Như thường lệ, chúng tôi sẽ hướng dẫn các bạn tích hợp FCS vào các Android, iOS và Web projects. Và nếu bạn đã thao tác với Authentication và Realtime Database, bạn sẽ thấy việc tích hợp FCS SDK hoàn toàn tương tự. Trong bài hướng dẫn này, chúng tôi sẽ đi vào trường hợp đơn giản nhất là bạn sẽ sử dụng Bucket (chỉ nên dịch là “xô chứa” để cho vui, vui lòng đừng dùng từ đó làm thuật ngữ) mặc định. Lưu ý là chúng tôi khuyến nghị các bạn nên tích hợp Authentication trước khi dùng Cloud Storage

######################################

3.1. Đối với Android:

3.1.1. Thêm thư viện và khởi tạo các instances cơ bản:

Bạn đã quá quen thuộc với yêu cầu Project của bạn đã phải được tích hợp firebase-core nên tôi sẽ không nói gì thêm, tuy nhiên nếu bạn chưa làm thì vui lòng xem lại Bài mở đầu của chúng tôi. Bạn không còn lạ lùng gì với việc yêu cầu Gradle compile thêm thư viện firebase-storage như bên dưới:

Sau khi mọi thứ đã được sẵn sàng thì việc khởi tạo instance cho FirebaseStorage là điều quá hiển nhiên.

Để tiến hành upload, download và delete các files thì bạn sẽ thao tác qua một instance của StorageReference. Nếu bạn đã làm qua DatabaseReference trong Realtime Database thì bạn sẽ không hề có cảm giác bỡ ngỡ vì chúng hoàn toàn tương tự nhau, cũng có hàm child(String child) để trỏ vào thư mục con. Cụ thể:

Vui lòng không đặt tên thư mục và tên tập tin có các kí tự (character) bị cấm, chẳng hạn #, [, ], *, hoặc ?. Lí do thì bạn hoặc biết rồi, hoặc có thể tự hiểu và tôi sẽ không giải thích gì ở đây. Và cũng không nên đặt tên thư mục và tên tập tin với các kí tự tiếng Việt trừ khi điều đó là vô cùng cần thiết. Tốt nhất, nếu tiếng Anh của bạn tốt thì nên sử dụng tiếng Anh.

3.1.2. Upload files:

Để upload các tập tin lên FCS thì trước tiên bạn sẽ phải chuyển chúng thành byte[ ] hoặc InputStream, hoặc trực tiếp hơn là từ chính tập tin đó qua Uri, và công việc chuyển đổi hoặc lấy Uri này thì tôi sẽ không trình bày chi tiết. Sau khi đã có các dữ liệu cần thiết thì ta sẽ gọi các hàm putBytes(byte[ ]), putStream(InputStream) hoặc putFile(Uri) thông qua mStorageRef, và các hàm này sẽ return một đối tượng UploadTask. Bạn có thể thêm các thông tin Metadata như chiều dài tập tin, ngày tạo, kiểu thông qua các lớp StorageMetadataStorageMetadata.Builder và truyền StorageMetadata instance đó làm tham số (param) thứ hai trong các hàm putBytes, putStream hoặc putFile tôi đã liệt kê. Cụ thể như sau:

Để theo dõi và nhận kết quả của quá trình upload thì ta chỉ việc thêm mấy cái Listener interfaces, điều này quá đỗi quen thuộc với các bạn rồi.

3.1.3. Download files:

Để download các files thì ta sẽ gọi các hàm getBytes() hoặc getFile(), ngược lại với upload. Bạn cũng có thể chỉ lấy URL trỏ tới file, chẳng hạn để chia sẻ. Cụ thể như sau:

3.1.4. Delete files:

Để xóa tập tin thì đơn giản là bạn chỉ cần gọi StorageReference#delete(). Lưu ý là hàm này không return ra kiểu boolean (với ý nghĩa là return true nếu delete được và false nếu không được), nên bạn sẽ phải tự thêm các listeners như bên trên để kiểm tra xem là việc xóa tập tin đó có thành công hay không.

######################################

3.2. Đối với iOS:

3.2.1. Thêm thư viện và khởi tạo các instances cơ bản:

Bạn đã quá quen thuộc với yêu cầu Project của bạn đã phải được tích hợp Firebase/Core nên tôi sẽ không nói gì thêm, tuy nhiên nếu bạn chưa làm thì vui lòng xem lại Bài mở đầu của chúng tôi. Bạn không còn lạ lùng gì với việc yêu cầu CocoaPods add thêm thư viện Firebase/Storage như bên dưới:

Sau khi đã đảm bảo đã có FIRApp.configure() thì việc khởi tạo FIRStorage instance là điều quá hiển nhiên:

Để tiến hành upload, download và delete các files thì bạn sẽ thao tác qua một instance của FIRStorageReference. Nếu bạn đã làm qua DatabaseReference trong Realtime Database thì bạn sẽ không hề có cảm giác bỡ ngỡ vì chúng hoàn toàn tương tự nhau, cũng có hàm child(String child) để trỏ vào thư mục con. Cụ thể:

Vui lòng không đặt tên thư mục và tên tập tin có các kí tự (character) bị cấm, chẳng hạn #, [, ], *, hoặc ?. Lí do thì bạn hoặc biết rồi, hoặc có thể tự hiểu và tôi sẽ không giải thích gì ở đây. Và cũng không nên đặt tên thư mục và tên tập tin với các kí tự tiếng Việt trừ khi điều đó là vô cùng cần thiết. Tốt nhất, nếu tiếng Anh của bạn tốt thì nên sử dụng tiếng Anh.

3.2.2. Upload files:

Để upload các tập tin lên FCS thì bạn có thể chọn trực tiếp dữ liệu trong bộ nhớ với hàm put() hoặc URL đại diện cho vị trí của tập tin đó với hàm putFile(), thông qua storageRef, và các hàm này sẽ return một đối tượng FIRUploadTask. Bạn có thể thêm các thông tin Metadata như chiều dài tập tin, ngày tạo, kiểu thông qua lớp FIRStorageMetadata và truyền FIRStorageMetadata instance đó làm tham số (param) thứ hai trong các hàm put() hoặc putFile() tôi đã liệt kê. Cụ thể như sau:

Để theo dõi và nhận kết quả của quá trình upload thì ta chỉ việc thêm mấy cái Observers interfaces, điều này quá đỗi quen thuộc với các bạn rồi.

3.2.3. Download files:

Để download các files thì ta sẽ gọi các hàm data() để lưu dữ liệu dưới dạng NSData hoặc write() để lưu trực tiếp vào một tập tin. Bạn cũng có thể chỉ lấy URL trỏ tới file, chẳng hạn để chia sẻ. Cụ thể như sau:

3.2.4. Delete files:

Để xóa tập tin thì đơn giản là bạn chỉ cần gọi FIRStorageReference#delete. Lưu ý là hàm này không return ra kiểu Bool (với ý nghĩa là return true nếu delete được và false nếu không được), nên bạn sẽ phải tự quan sát xem có error phát sinh hay không.

######################################

3.3. Đối với Web:

3.3.1. Khởi tạo các instances cơ bản:

Bạn đã quá quen thuộc với yêu cầu Project của bạn đã phải được tích hợp Firebase nên tôi sẽ không nói gì thêm, tuy nhiên nếu bạn chưa làm thì vui lòng xem lại Bài mở đầu của chúng tôi. Sau khi đã cho initialize thì bạn sẽ làm động tác quen thuộc:

Để tiến hành upload, download và delete các files thì bạn sẽ thao tác qua một instance của Storage Reference. Nếu bạn đã làm qua Database Reference trong Realtime Database thì bạn sẽ không hề có cảm giác bỡ ngỡ vì chúng hoàn toàn tương tự nhau, cũng có hàm child(String child) để trỏ vào thư mục con. Cụ thể:

Vui lòng không đặt tên thư mục và tên tập tin có các kí tự (character) bị cấm, chẳng hạn #, [, ], *, hoặc ?. Lí do thì bạn hoặc biết rồi, hoặc có thể tự hiểu và tôi sẽ không giải thích gì ở đây. Và cũng không nên đặt tên thư mục và tên tập tin với các kí tự tiếng Việt trừ khi điều đó là vô cùng cần thiết. Tốt nhất, nếu tiếng Anh của bạn tốt thì nên sử dụng tiếng Anh.

3.3.2. Upload files:

Để upload các tập tin lên FCS thì bạn có thể chọn trực tiếp dữ liệu trong bộ nhớ với hàm put(file) – với kiểu là File hoặc Blob, hoặc put(bytes), hoặc putString(string) với string chứa các thông tin thô hay được mã hóa sẵn, thông qua storageRef, và các hàm này sẽ return một đối tượng UploadTask. Bạn có thể thêm các thông tin Metadata như chiều dài tập tin, ngày tạo, kiểu thông qua lớp FullMetadata và truyền FullMetadata instance đó làm tham số (param) thứ hai trong các hàm put(file), put(bytes) hoặc putString(string) tôi đã liệt kê. Cụ thể như sau:

Để theo dõi và nhận kết quả của quá trình upload thì ta chỉ việc thêm mấy cái Listener interfaces, điều này quá đỗi quen thuộc với các bạn rồi.

3.3.3. Download files:

Để download các files thì ta sẽ gọi các hàm getDownloadURL. Bạn cũng có thể chỉ lấy URL trỏ tới file, chẳng hạn để chia sẻ. Cụ thể như sau:

3.3.4. Delete files

Để xóa tập tin thì đơn giản là bạn chỉ cần gọi Storage Reference#delete(). Lưu ý là hàm này không return ra kiểu Boolean (với ý nghĩa là return true nếu delete được và false nếu không được), nên bạn sẽ phải tự quan sát xem có error phát sinh hay không.

######################################

Hi vọng các bạn đã nắm bắt được các thao tác cơ bản với Firebase Storage để vận dụng vào công việc viết code của mình. Sẽ còn nhiều vấn đề khác mà chúng tôi sẽ không trình bày thêm, chẳng hạn như các “xô chứa” (Bucket) cũng như các thao tác nâng cao bảo mật mà các bạn sẽ cần nghiên cứu khi cần để tối ưu hóa hạ tầng dữ liệu của mình. Chúc các bạn thành công.

1 thought on “Firebase, Bài 3: Giới thiệu về Cloud Storage.”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.