Flutter'da Cloud Storage ile dosya yükleme

Cloud Storage for Firebase, Firebase tarafından sağlanan ve yönetilen bir Cloud Storage paketine hızlı ve kolay bir şekilde dosya yüklemenize olanak tanır.

Dosya Yükle

Bir dosyayı Cloud Storage'a yüklemek için önce dosya adı dahil olmak üzere dosyanın tam yoluna bir referans oluşturmanız gerekir.

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

// Create a reference to "mountains.jpg"
final mountainsRef = storageRef.child("mountains.jpg");

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

// While the file names are the same, the references point to different files
assert(mountainsRef.name == mountainImagesRef.name);
assert(mountainsRef.fullPath != mountainImagesRef.fullPath);

Uygun bir referans oluşturduktan sonra dosyayı Cloud Storage'a yüklemek için putFile(), putString() veya putData() yöntemini çağırırsınız.

Cloud Storage paketinizin köküne referans veren verileri yükleyemezsiniz. Referansınız bir alt URL'ye yönlendirmelidir.

Dosyadan yükle

Bir dosya yüklemek için önce dosyanın cihaz üzerindeki konumunun mutlak yolunu öğrenmeniz gerekir. Örneğin, bir dosya uygulamanın dokümanlar dizininde varsa dosya yolu oluşturmak ve putFile() hizmetine iletmek için resmi path_provider paketini kullanın:

Directory appDocDir = await getApplicationDocumentsDirectory();
String filePath = '${appDocDir.absolute}/file-to-upload.png';
File file = File(filePath);

try {
  await mountainsRef.putFile(file);
} on firebase_core.FirebaseException catch (e) {
  // ...
}

Dizeden yükle

Verileri, putString() yöntemini kullanarak ham, base64, base64url veya data_url kodlamalı dize olarak yükleyebilirsiniz. Örneğin, Veri URL'si olarak kodlanmış bir metin dizesini yüklemek için:

String dataUrl = 'data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==';

try {
  await mountainsRef.putString(dataUrl, format: PutStringFormat.dataUrl);
} on FirebaseException catch (e) {
  // ...
}

Ham verileri yükleme

Dize veya File yüklemenin pratik olmadığı durumlarda, daha düşük düzeyde yazılmış verileri Uint8List biçiminde yükleyebilirsiniz. Bu durumda, verilerinizle birlikte putData() yöntemini çağırın:

try {
  // Upload raw data.
  await mountainsRef.putData(data);
} on firebase_core.FirebaseException catch (e) {
  // ...
}

İndirme URL'si al

Bir dosya yükledikten sonra, Reference üzerinde getDownloadUrl() yöntemini çağırarak dosyayı indirebileceğiniz bir URL alabilirsiniz:

await mountainsRef.getDownloadURL();

Dosya Meta Verileri Ekleme

Dosya yüklerken meta verileri de ekleyebilirsiniz. Bu meta veriler, contentType (genellikle MIME türü) gibi tipik dosya meta verisi özelliklerini içerir. putFile() yöntemi, MIME türünü File uzantısından otomatik olarak tahmin eder ancak meta verilerde contentType belirterek otomatik olarak algılanan türü geçersiz kılabilirsiniz. contentType sağlamazsanız ve Cloud Storage, dosya uzantısından bir varsayılan çıkaramazsa Cloud Storage application/octet-stream kullanır. Dosya Meta Verilerini Kullanma başlıklı makaleye göz atın.

try {
  await mountainsRef.putFile(file, SettableMetadata(
    contentType: "image/jpeg",
  ));
} on firebase_core.FirebaseException catch (e) {
  // ...
}

Yüklemeleri Yönet

Yüklemeleri başlatmanın yanı sıra pause(), resume() ve cancel() yöntemlerini kullanarak yüklemeleri duraklatabilir, devam ettirebilir ve iptal edebilirsiniz. Etkinlikleri duraklatma ve devam ettirme, sırasıyla pause ve progress durum değişikliklerini yükseltir. Yükleme işlemi iptal edildiğinde, yüklemenin iptal edildiğini belirten bir hata mesajı gösterilir.

final task = mountainsRef.putFile(largeFile);

// Pause the upload.
bool paused = await task.pause();
print('paused, $paused');

// Resume the upload.
bool resumed = await task.resume();
print('resumed, $resumed');

// Cancel the upload.
bool canceled = await task.cancel();
print('canceled, $canceled');

Yükleme İlerlemesini İzleme

Yükleme görevinizdeki başarı, başarısızlık, ilerleme veya duraklamaları yönetmek için bir görevin etkinlik akışını dinleyebilirsiniz:

Etkinlik Türü Tipik Kullanım
TaskState.running Veriler aktarılırken düzenli olarak yayınlanır ve yükleme/indirme göstergesini doldurmak için kullanılabilir.
TaskState.paused Görev her duraklatıldığında yayınlanır.
TaskState.success Görev başarıyla tamamlandığında yayınlanır.
TaskState.canceled Görev her iptal edildiğinde yayınlanır.
TaskState.error Yükleme başarısız olduğunda yayınlanır. Bu durum ağ zaman aşımları, yetkilendirme hataları veya görevi iptal etmeniz nedeniyle oluşabilir.
mountainsRef.putFile(file).snapshotEvents.listen((taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      // ...
      break;
    case TaskState.paused:
      // ...
      break;
    case TaskState.success:
      // ...
      break;
    case TaskState.canceled:
      // ...
      break;
    case TaskState.error:
      // ...
      break;
  }
});

Hata İşleme

Yükleme sırasında, yerel dosyanın mevcut olmaması veya kullanıcının istenen dosyayı yükleme izninin olmaması gibi çeşitli nedenler vardır. Hatalar hakkında daha fazla bilgiyi belgelerin İşleyici Hataları bölümünde bulabilirsiniz.

Tam Örnek

İlerleme durumu izleme ve hata giderme özellikli bir yükleme örneği aşağıda verilmiştir:

final appDocDir = await getApplicationDocumentsDirectory();
final filePath = "${appDocDir.absolute}/path/to/mountains.jpg";
final file = File(filePath);

// Create the file metadata
final metadata = SettableMetadata(contentType: "image/jpeg");

// Create a reference to the Firebase Storage bucket
final storageRef = FirebaseStorage.instance.ref();

// Upload file and metadata to the path 'images/mountains.jpg'
final uploadTask = storageRef
    .child("images/path/to/mountains.jpg")
    .putFile(file, metadata);

// Listen for state changes, errors, and completion of the upload.
uploadTask.snapshotEvents.listen((TaskSnapshot taskSnapshot) {
  switch (taskSnapshot.state) {
    case TaskState.running:
      final progress =
          100.0 * (taskSnapshot.bytesTransferred / taskSnapshot.totalBytes);
      print("Upload is $progress% complete.");
      break;
    case TaskState.paused:
      print("Upload is paused.");
      break;
    case TaskState.canceled:
      print("Upload was canceled");
      break;
    case TaskState.error:
      // Handle unsuccessful uploads
      break;
    case TaskState.success:
      // Handle successful uploads on complete
      // ...
      break;
  }
});

Dosyalarınızı yüklediğinize göre şimdi bunları Cloud Storage'dan indirmeyi öğrenelim.