Flutter'da Cloud Storage ile dosya yükleme

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

Dosya Yükle

Cloud Storage'a dosya yüklemek için önce dosya adı da dahil olmak üzere dosyanın tam yoluna bir referans oluşturursunuz.

// 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ükleme

Bir dosyayı yüklemek için öncelikle cihazdaki konumunun mutlak yolunu almanız gerekir. Örneğin, uygulamanın belgeler dizininde bir dosya varsa dosya yolu oluşturmak ve bunu putFile()'ye 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ükleme

putString() yöntemini kullanarak verileri ham, base64, base64url veya data_url kodlu dize olarak yükleyebilirsiniz. Örneğin, bir metin dizesini veri URL'si olarak kodlanmış şekilde 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 türü belirlenmiş verileri Uint8List biçiminde yükleyebilirsiniz. Bu durumda, putData() yöntemini verilerinizle birlikte ç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 verileri de ekleyebilirsiniz. Bu meta veriler, contentType gibi tipik dosya meta verisi özelliklerini içerir (genellikle MIME türü olarak adlandırılır). putFile() yöntemi, MIME türünü File uzantısından otomatik olarak çıkarır. Ancak meta verilerde contentType değerini 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 contentType çıkaramazsa Cloud Storage application/octet-stream kullanı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

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 işlemleri sırasıyla pause ve progress durum değişikliklerine neden olur. Yüklemenin iptal edilmesi, yüklemenin iptal edildiğini belirten bir hatayla sonuçlanır.

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örevinizdeki başarı, hata, ilerleme veya duraklatma durumlarını yönetmek için 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 duraklatıldığında her zaman yayınlanır.
TaskState.success Görev başarıyla tamamlandığında yayınlanır.
TaskState.canceled Görev iptal edildiğinde her zaman 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 etmenizden kaynaklanabilir.
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 çeşitli nedenleri vardır. Örneğin, yerel dosya mevcut olmayabilir veya kullanıcının istenen dosyayı yükleme izni olmayabilir. Hatalar hakkında daha fazla bilgiyi dokümanların Hataları İşleme bölümünde bulabilirsiniz.

Tam Örnek

Aşağıda, ilerleme izleme ve hata işleme içeren bir yükleme işleminin tam örneği gösterilmektedir:

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 şimdi de Cloud Storage'dan nasıl indireceğinizi öğrenelim.