12/08/2018, 13:47

Dùng Firebase Storage như backend lưu trữ dữ liệu cho ứng dụng Android

I. GIỚI THIỆU Firebase Storage là dịch vụ được xây dựng cho mục đích lưu trữ và quản lý các nội dung mà người dùng ứng dụng tạo ra như ảnh, videos hay dữ liệu dạng file. Firebase Storage cung cấp các API cho việc uploads và download các file từ app của bạn một cách bảo mật và bạn không cần quan ...

I. GIỚI THIỆU

Firebase Storage là dịch vụ được xây dựng cho mục đích lưu trữ và quản lý các nội dung mà người dùng ứng dụng tạo ra như ảnh, videos hay dữ liệu dạng file.

Firebase Storage cung cấp các API cho việc uploads và download các file từ app của bạn một cách bảo mật và bạn không cần quan tâm đến chất lượng đường truyền mạng.

Firebase Storage được xây dựng trên nền tảng Google Cloud Platform nên có nhiều lợi thế.

Một số điểm mạnh:

  • Robust : Firebase Storage thực hiện việc upload và download không phụ thuộc vào chất lượng đường truyền mạng hơn nữa các quá trình đó có thể bắt đầu lại khi bị tạm dừng giúp tiết kiệm thời gian và băng thông.
  • Secure: Được tích hợp Firebase Authentication cho việc bảo mật nên dễ dàng quản lý quyền truy cập vào các files.
  • Scalable : Firebase Storage được xây dựng trên nền tảng Google Cloud Platform nên khả năng mở rộng có thể lên đến hàng Petabyte dữ liệu.

II. CÀI ĐẶT FIREBASE SDK

Để có thể sử dụng Firebase SDK trong project trước hết bạn phải tạo thêm ứng dụng trong Firebase Console.

1.png

Giao diện Dashboard của một ứng dụng như sau:

2.png

Bạn vào nhấn vào "Add Firebase to your Android app" và điền tên package name ứng dụng cùng với SHA1 của keystore, bạn có thể thêm cả SHA1 của debug key và release key.

3.png

Cách lấy SHA1 của file keystore, dùng keytool của jdk.

keytool -list -v -keystore C:usersLuPham.androiddebug.keystore -alias androiddebugkey -storepass android -keypass android

Add App và tải file json chứa thông tin cấu hình project đặt file json đó trong thư mục của module chính.

4.png

Tiếp đến thêm dependencies

Thêm vào file build.gradle của project (<project>/build.gradle):

buildscript {
  dependencies {
    // Add this line
    classpath 'com.google.gms:google-services:3.0.0'
  }
}

Thêm vào file build.gradle của module (<project>/<app-module>/build.gradle):

dependencies{
    compile 'com.google.firebase:firebase-storage:9.4.0'
    compile 'com.google.firebase:firebase-auth:9.4.0'
}

// Add to the bottom of the file
apply plugin: 'com.google.gms.google-services'

Vậy là xong bước cài đặt.

III. REFERENCE

Firebase Storage sử dụng các Reference để chỉ đến một bucket hoặc một file, bạn có thể làm bất cứ thứ gì với bucket, files thông qua Reference đó như upload, download hay thay đổi metadata hoặc xóa file. Reference mang tính chất lightweight vì vậy bạn có thể sử dụng nó bao nhiêu tùy thích hoặc có thể sử dụng lại một Reference cho nhiều hành động khác nhau.

1. Tạo Reference

Tạo một Reference đến root của Firebase Storage và bạn có thể làm gì tùy ý.

  FirebaseStorage rootRef = FirebaseStorage.getInstance();

Bên cạnh đó có thể tạo một Reference từ một Url

// Create a storage reference from our app
StorageReference storageRef = storage.getReferenceFromUrl(" gs://fir-storage-sample-7ce3e.appspot.com");

Tạo Refernce tới cấp độ thấp hơn bằng method child(), bạn có thể tạo Reference ngay cả khi file chưa tồn tại.

// Create a child reference
// imagesRef now points to "images"
StorageReference imagesRef = storageRef.child("images");

// Child references can also take paths
// spaceRef now points to "users/me/profile.png
// imagesRef still points to "images"
StorageReference spaceRef = storageRef.child("images/space.jpg");

2. Di chuyển với Reference

Bạn có thể sử dụng 2 mthod getParent() và getRoot() để di chuyển lên trong cấu trúc files.

    // Parent allows us to move our reference to point to
    // imagesRef now points to 'images'
    imagesRef = spaceRef.getParent();

    // Root allows us to move all the way back to the top of our bucket
    // rootRef now points to the root
    StorageReference rootRef = spaceRef.getRoot();

child(), getParent(), và getRoot() có thể kết hợp với nhau nhiều lần.

    // References can be chained together multiple times
    // earthRef points to 'images/earth.jpg'
    StorageReference earthRef = spaceRef.getParent().child("earth.jpg");

    // nullRef is null, since the parent of root is null
    StorageReference nullRef = spaceRef.getRoot().getParent();

IV. UPLOAD FILES

Tạo reference

    StorageReference storageRef = storage.getReferenceFromUrl("gs://<your-bucket-name>");

    // Create a reference to 'images/mountains.jpg'
    StorageReference mountainImagesRef = storageRef.child("images/mountains.jpg");

Bạn có thể upload từ Memory, Stream hoặc Local File. Cách upload một file như sau

    Uri file = Uri.fromFile(new File("path/to/images/rivers.jpg"));
    StorageReference riversRef = storageRef.child("images/"+file.getLastPathSegment());
    uploadTask = riversRef.putFile(file);

    // Register observers to listen for when the download is done or if it fails
    uploadTask.addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle unsuccessful uploads
        }
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
            Uri downloadUrl = taskSnapshot.getDownloadUrl();
        }
    });

V. DOWNLOAD FILES

Tương tự khi download file bạn cũng phải tạo reference và có thể download file vào Memory hoặc Local file.

islandRef = storageRef.child("images/island.jpg");

File localFile = File.createTempFile("images", "jpg");

islandRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
        // Local temp file has been created
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

VI. KẾT LUẬN

Firebase Storage là một giải pháp tuyệt vời cho bạn lưu trữ file tạo ra từ app của bạn hoặc là nơi lưu trữ file dữ liệu online cho app. Bạn không cần biết một dòng code server hay quan tâm đến hạ tầng phức tạp mà vẫn có thể viết app phục vụ hàng triệu người dùng.

Tham khảo Firebase Storage Document

0