Flutter'da Cloud Storage ile dosya indirme

Cloud Storage for Firebase, Firebase tarafından sağlanan ve yönetilen bir Cloud Storage paketinden dosyaları hızlı ve kolay bir şekilde indirmenize olanak tanır.

Referans Oluşturma

Bir dosyayı indirmek için önce indirmek istediğiniz dosyanın Cloud Storage referansını oluşturun.

Cloud Storage paketinizin köküne alt yollar ekleyerek referans oluşturabilir veya Cloud Storage'daki bir nesneye referans veren mevcut bir gs:// ya da https:// URL'den referans oluşturabilirsiniz.

// Create a storage reference from our app
final storageRef = FirebaseStorage.instance.ref();

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

// Create a reference to a file from a Google Cloud Storage URI
final gsReference =
    FirebaseStorage.instance.refFromURL("gs://YOUR_BUCKET/images/stars.jpg");

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

Dosyaları İndir

Referansınız olduğunda getData() işlevini çağırarak Cloud Storage'dan dosya indirebilirsiniz. Dosyayı başka bir kitaplıkla indirmeyi tercih ederseniz getDownloadUrl() ile indirme URL'si alabilirsiniz.

Belleğe indirme

Dosyayı getData() yöntemiyle UInt8List konumuna indirin. Bu, dosya indirmenin en kolay yoludur ancak dosyanızın tüm içeriğini belleğe yüklemesi gerekir. Uygulamanızın kullanılabilir belleğinden daha büyük bir dosya isteğinde bulunursanız uygulamanız kilitlenir. Bellek sorunlarına karşı koruma sağlamak için getData() maksimum bayt miktarı indirir. Maksimum boyutu, uygulamanızın işleyebileceği bir değere ayarlayın veya başka bir indirme yöntemi kullanın.

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

try {
  const oneMegabyte = 1024 * 1024;
  final Uint8List? data = await islandRef.getData(oneMegabyte);
  // Data for "images/island.jpg" is returned, use this as needed.
} on FirebaseException catch (e) {
  // Handle any errors.
}

Yerel bir dosyaya indirme

writeToFile() yöntemi, dosyayı doğrudan yerel bir cihaza indirir. Kullanıcılarınızın dosyalara çevrimdışı erişmek veya dosyayı farklı bir uygulamada paylaşmak istemesi durumunda bu işlevi kullanın. writeToFile(), indirme işleminizi yönetmek ve indirme durumunu izlemek için kullanabileceğiniz bir DownloadTask döndürür.

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

final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/images/island.jpg";
final file = File(filePath);

final downloadTask = islandRef.writeToFile(file);
downloadTask.snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // TODO: Handle this case.
      break;
    case TaskState.paused:
      // TODO: Handle this case.
      break;
    case TaskState.success:
      // TODO: Handle this case.
      break;
    case TaskState.canceled:
      // TODO: Handle this case.
      break;
    case TaskState.error:
      // TODO: Handle this case.
      break;
  }
});

URL ile veri indirme

URL'lere dayalı bir indirme altyapınız varsa veya yalnızca paylaşılacak bir URL istiyorsanız Cloud Storage referansında getDownloadURL() yöntemini çağırarak dosyanın indirme URL'sini alabilirsiniz.

final imageUrl =
    await storageRef.child("users/me/profile.png").getDownloadURL();

Hataları İşleme

İndirme sırasında hataların oluşmasının birkaç nedeni vardır. Örneğin, dosya mevcut olmayabilir veya kullanıcının istenen dosyaya erişme izni olmayabilir. Hatalar hakkında daha fazla bilgiyi dokümanların Hataları İşleme bölümünde bulabilirsiniz.

Tam Örnek

Aşağıda, hata işlemeyle yapılan bir indirme işleminin tam örneği gösterilmektedir:

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

final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/images/island.jpg";
final file = File(filePath);

final downloadTask = islandRef.writeToFile(file);
downloadTask.snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // TODO: Handle this case.
      break;
    case TaskState.paused:
      // TODO: Handle this case.
      break;
    case TaskState.success:
      // TODO: Handle this case.
      break;
    case TaskState.canceled:
      // TODO: Handle this case.
      break;
    case TaskState.error:
      // TODO: Handle this case.
      break;
  }
});

Cloud Storage'da depolanan dosyaların meta verilerini alıp güncelleyebilirsiniz.