הורד קבצים עם Cloud Storage באנדרואיד

Cloud Storage for Firebase מאפשר לך להוריד במהירות ובקלות קבצים מ- Cloud Storage שסופק ומנוהל על ידי Firebase.

צור הפניה

כדי להוריד קובץ, תחילה צור הפניה ל-Cloud Storage לקובץ שברצונך להוריד.

אתה יכול ליצור הפניה על ידי הוספת נתיבים צאצאים לשורש של דלי Cloud Storage שלך, או שאתה יכול ליצור הפניה מכתובת URL קיימת של gs:// או https:// המפנה לאובייקט ב-Cloud Storage.

Kotlin+KTX

// Create a storage reference from our app
val storageRef = storage.reference

// Create a reference with an initial file path and name
val pathReference = storageRef.child("images/stars.jpg")

// Create a reference to a file from a Google Cloud Storage URI
val gsReference = storage.getReferenceFromUrl("gs://bucket/images/stars.jpg")

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
val httpsReference = storage.getReferenceFromUrl(
    "https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg",
)

Java

// Create a storage reference from our app
StorageReference storageRef = storage.getReference();

// Create a reference with an initial file path and name
StorageReference pathReference = storageRef.child("images/stars.jpg");

// Create a reference to a file from a Google Cloud Storage URI
StorageReference gsReference = storage.getReferenceFromUrl("gs://bucket/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
StorageReference httpsReference = storage.getReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");

להוריד קבצים

ברגע שיש לך הפניה, תוכל להוריד קבצים מ-Cloud Storage על ידי קריאה ל- getBytes() או getStream() . אם אתה מעדיף להוריד את הקובץ עם ספרייה אחרת, אתה יכול לקבל כתובת URL להורדה עם getDownloadUrl() .

הורדה בזיכרון

הורד את הקובץ ל- byte[] בשיטה getBytes() ‎. זוהי הדרך הקלה ביותר להוריד קובץ, אך היא חייבת לטעון את כל התוכן של הקובץ שלך לזיכרון. אם תבקש קובץ גדול מהזיכרון הזמין של האפליקציה שלך, האפליקציה שלך תתרסק. כדי להגן מפני בעיות זיכרון, getBytes() לוקח כמות מקסימלית של בתים להורדה. הגדר את הגודל המקסימלי למשהו שאתה יודע שהאפליקציה שלך יכולה להתמודד איתו, או השתמש בשיטת הורדה אחרת.

Kotlin+KTX

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

val ONE_MEGABYTE: Long = 1024 * 1024
islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener {
    // Data for "images/island.jpg" is returned, use this as needed
}.addOnFailureListener {
    // Handle any errors
}

Java

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

final long ONE_MEGABYTE = 1024 * 1024;
islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
    @Override
    public void onSuccess(byte[] bytes) {
        // Data for "images/island.jpg" is returns, use this as needed
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

הורד לקובץ מקומי

שיטת getFile() מורידה קובץ ישירות למכשיר מקומי. השתמש בזה אם המשתמשים שלך רוצים לקבל גישה לקובץ במצב לא מקוון או לשתף את הקובץ באפליקציה אחרת. getFile() מחזירה DownloadTask שבה אתה יכול להשתמש כדי לנהל את ההורדה שלך ולנטר את מצב ההורדה.

Kotlin+KTX

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

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

islandRef.getFile(localFile).addOnSuccessListener {
    // Local temp file has been created
}.addOnFailureListener {
    // Handle any errors
}

Java

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
    }
});

אם ברצונך לנהל באופן פעיל את ההורדה שלך, ראה ניהול הורדות למידע נוסף.

הורד נתונים באמצעות כתובת URL

אם כבר יש לך תשתית הורדה המבוססת על כתובות אתרים, או סתם רוצה שכתובת אתר שתשתף, תוכל לקבל את כתובת האתר להורדה של קובץ על ידי קריאה לשיטת getDownloadUrl() ב-Cloud Storage.

Kotlin+KTX

storageRef.child("users/me/profile.png").downloadUrl.addOnSuccessListener {
    // Got the download URL for 'users/me/profile.png'
}.addOnFailureListener {
    // Handle any errors
}

Java

storageRef.child("users/me/profile.png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri uri) {
        // Got the download URL for 'users/me/profile.png'
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

הורדת תמונות עם FirebaseUI

FirebaseUI מספק כריכות מקוריות לנייד פשוטות, הניתנות להתאמה אישית ומוכנות לייצור כדי לבטל את קוד ה-boilerplate ולקדם את השיטות המומלצות של Google. באמצעות FirebaseUI תוכל להוריד במהירות ובקלות תמונות, לשמור במטמון ולהציג תמונות מ-Cloud Storage באמצעות השילוב שלנו עם Glide .

ראשית, הוסף את FirebaseUI ל- app/build.gradle שלך:

dependencies {
    // FirebaseUI Storage only
    implementation 'com.firebaseui:firebase-ui-storage:7.2.0'
}

לאחר מכן תוכל לטעון תמונות ישירות מ-Cloud Storage לתוך ImageView :

Kotlin+KTX

// Reference to an image file in Cloud Storage
val storageReference = Firebase.storage.reference

// ImageView in your Activity
val imageView = findViewById<ImageView>(R.id.imageView)

// Download directly from StorageReference using Glide
// (See MyAppGlideModule for Loader registration)
Glide.with(context)
    .load(storageReference)
    .into(imageView)

Java

// Reference to an image file in Cloud Storage
StorageReference storageReference = FirebaseStorage.getInstance().getReference();

// ImageView in your Activity
ImageView imageView = findViewById(R.id.imageView);

// Download directly from StorageReference using Glide
// (See MyAppGlideModule for Loader registration)
Glide.with(context)
        .load(storageReference)
        .into(imageView);

טיפול בשינויים במחזור החיים של פעילות

ההורדות ממשיכות ברקע גם לאחר שינויים במחזור החיים של הפעילות (כגון הצגת דו-שיח או סיבוב המסך). כל המאזינים שצירפת יישארו צמודים גם הם. זה עלול לגרום לתוצאות בלתי צפויות אם הם יקראו לאחר הפסקת הפעילות.

אתה יכול לפתור בעיה זו על ידי הרשמה למאזינים שלך עם היקף פעילות כדי לבטל אוטומטית את הרישום שלהם כשהפעילות נפסקת. לאחר מכן, השתמש בשיטת getActiveDownloadTasks כאשר הפעילות מתחילה מחדש כדי להשיג משימות הורדה שעדיין פועלות או שהושלמו לאחרונה.

הדוגמה להלן מדגימה זאת ומראה גם כיצד להתמיד בנתיב ההתייחסות לאחסון בשימוש.

Kotlin+KTX

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)

    // If there's a download in progress, save the reference so you can query it later
    outState.putString("reference", storageRef.toString())
}

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)

    // If there was a download in progress, get its reference and create a new StorageReference
    val stringRef = savedInstanceState.getString("reference") ?: return

    storageRef = Firebase.storage.getReferenceFromUrl(stringRef)

    // Find all DownloadTasks under this StorageReference (in this example, there should be one)
    val tasks = storageRef.activeDownloadTasks

    if (tasks.size > 0) {
        // Get the task monitoring the download
        val task = tasks[0]

        // Add new listeners to the task using an Activity scope
        task.addOnSuccessListener(this) {
            // Success!
            // ...
        }
    }
}

Java

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // If there's a download in progress, save the reference so you can query it later
    if (mStorageRef != null) {
        outState.putString("reference", mStorageRef.toString());
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    // If there was a download in progress, get its reference and create a new StorageReference
    final String stringRef = savedInstanceState.getString("reference");
    if (stringRef == null) {
        return;
    }
    mStorageRef = FirebaseStorage.getInstance().getReferenceFromUrl(stringRef);

    // Find all DownloadTasks under this StorageReference (in this example, there should be one)
    List<FileDownloadTask> tasks = mStorageRef.getActiveDownloadTasks();
    if (tasks.size() > 0) {
        // Get the task monitoring the download
        FileDownloadTask task = tasks.get(0);

        // Add new listeners to the task using an Activity scope
        task.addOnSuccessListener(this, new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(FileDownloadTask.TaskSnapshot state) {
                // Success!
                // ...
            }
        });
    }
}

טיפול בשגיאות

ישנן מספר סיבות לכך שגיאות עשויות להתרחש בהורדה, כולל הקובץ אינו קיים, או שלמשתמש אין הרשאה לגשת לקובץ הרצוי. מידע נוסף על שגיאות ניתן למצוא בקטע טיפול בשגיאות במסמכים.

דוגמה מלאה

דוגמה מלאה של הורדה עם טיפול בשגיאות מוצגת להלן:

Kotlin+KTX

storageRef.child("users/me/profile.png").getBytes(Long.MAX_VALUE).addOnSuccessListener {
    // Use the bytes to display the image
}.addOnFailureListener {
    // Handle any errors
}

Java

storageRef.child("users/me/profile.png").getBytes(Long.MAX_VALUE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
    @Override
    public void onSuccess(byte[] bytes) {
        // Use the bytes to display the image
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});

אתה יכול גם לקבל ולעדכן מטא נתונים עבור קבצים המאוחסנים ב-Cloud Storage.