Flutter'da Cloud Storage ile dosya indirme

Firebase için Cloud Storage, 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 öncelikle indirmek istediğiniz dosyaya Cloud Storage referansı 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:// veya https:// URL'sinden 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 aldıktan sonra getData() veya getStream() işlevini çağırarak Cloud Storage'dan dosya indirebilirsiniz. Dosyayı başka bir kitaplıkla indirmeyi tercih ederseniz getDownloadUrl() ile indirme URL'si alabilirsiniz.

Hafızaya indirme

Dosyayı getData() yöntemiyle bir UInt8List'e indirin. Dosya indirmenin en kolay yolu budur ancak dosyanızın içeriğinin tamamını belleğe yüklemesi gerekir. Uygulamanızın kullanılabilir belleğinden daha büyük bir dosya isterseniz uygulamanız kilitlenir. Bellek sorunlarına karşı koruma sağlamak için getData(), indirilecek maksimum bayt miktarını alır. Maksimum boyutu, uygulamanızın kaldırabileceğini bildiğiniz 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 çevrimdışıyken dosyaya erişmek veya dosyayı farklı bir uygulamada paylaşmak istiyorsa bunu 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;
  }
});

Verileri URL üzerinden indirme

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

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

Hataları işleme

İndirme sırasında, dosyanın mevcut olmaması veya kullanıcının istenen dosyaya erişme izninin olmaması gibi çeşitli nedenlerle hata oluşabilir. Hatalarla ilgili daha fazla bilgiyi dokümanların Hataları İşleme bölümünde bulabilirsiniz.

Tam Örnek

Hata işleme içeren bir indirme işleminin tam örneği aşağıda verilmiştir:

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.