Flutter'da Cloud Storage ile dosya yükleme

Firebase için Cloud Storage, 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ı da dahil olmak üzere dosyanın tam yoluna referans oluşturun.

// 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 veriler yükleyemezsiniz. Referansınız bir alt URL'ye işaret etmelidir.

Dosyadan yükleme

Bir dosyayı yüklemek için önce cihazdaki mutlak yolunu almanız gerekir. Örneğin, uygulamanın belgeler dizininde bir dosya varsa resmi path_provider paketini kullanarak bir dosya yolu oluşturun ve putFile()'a iletin:

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) {
  // ...
}

Dize üzerinden yükleme

putString() yöntemini kullanarak verileri ham, base64, base64url veya data_url kodlanmış 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 uygun olmadığı durumlarda, alt düzey yazılmış verileri Uint8List biçiminde yükleyebilirsiniz. Bu durumda, verilerinizle putData() yöntemini çağırın:

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

İndirme URL'si alma

Bir dosyayı yükledikten sonra Reference üzerinde getDownloadUrl() yöntemini çağırarak dosyayı indirmek için bir URL alabilirsiniz:

await mountainsRef.getDownloadURL();

Dosya Meta Verileri Ekleme

Dosya yüklerken meta veri de ekleyebilirsiniz. Bu meta veriler, contentType (genellikle MIME türü olarak adlandırılır) gibi tipik dosya meta veri özelliklerini içerir. putFile() yöntemi, MIME türünü File uzantısından otomatik olarak çıkarır 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 varsayılan bir değer çıkaramazsa application/octet-stream kullanılır. Dosya meta verilerini kullanma başlıklı makaleyi inceleyin.

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

Yüklemeleri Yönet

pause(), resume() ve cancel() yöntemlerini kullanarak yüklemeleri başlatmanın yanı sıra duraklatabilir, devam ettirebilir ve iptal edebilirsiniz. Duraklatma ve devam ettirme etkinlikleri sırasıyla pause ve progress durum değişikliklerini tetikler. Yüklemenin iptal edilmesi, yüklemenin iptal edildiğini belirten bir hatayla yüklemenin başarısız olmasına neden olur.

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 ilerleme durumunu izleme

Yükleme görevinizde başarı, başarısızlık, ilerleme veya duraklamalar ile ilgili işlemleri yapmak için bir görevin etkinlik akışını dinleyebilirsiniz:

Etkinlik Türü Tipik Kullanım
TaskState.running Veriler aktarılırken düzenli aralıklarla yayınlanır ve bir 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 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 ortaya çıkabilir.
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 hataların oluşmasının birden çok nedeni vardır. Örneğin, yerel dosyanın mevcut olmaması veya kullanıcının istenen dosyayı yükleme iznine sahip olmaması. Hatalarla ilgili daha fazla bilgiyi dokümanların Hataları İşleme bölümünde bulabilirsiniz.

Tam Örnek

Aşağıda, ilerleme durumunu izleme ve hata işleme içeren bir yükleme örneği 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ı yüklediğinize göre, Cloud Storage'dan nasıl indireceğinizi öğrenelim.