Flutter'da Cloud Storage ile dosya yükleyin

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

Dosyaları yükle

Cloud Storage'a bir dosya yüklemek için öncelikle 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 referansla veri yükleyemezsiniz. Referansınız bir alt URL'ye işaret etmelidir.

Bir dosyadan yükleme

Bir dosyayı yüklemek için öncelikle dosyanın cihazdaki konumuna giden mutlak yolu almanız gerekir. Örneğin, uygulamanın belgeler dizininde bir dosya mevcutsa, bir dosya yolu oluşturmak ve bunu putFile() öğesine 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) {
  // ...
}

Bir Dizeden Yükleme

putString() yöntemini kullanarak verileri ham, base64 , base64url veya data_url kodlu 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

Bir dize veya File yüklemenin pratik olmadığı durumlar için daha düşük düzeyde yazılan 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) {
  // ...
}

Bir indirme URL'si alın

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

await mountainsRef.getDownloadURL();

Dosya Meta Verilerini Ekle

Dosyaları yüklerken meta verileri de ekleyebilirsiniz. Bu meta veriler, contentType (genellikle MIME türü olarak anılır) gibi tipik dosya meta verileri ö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. Bir contentType sağlamazsanız ve Cloud Storage dosya uzantısından bir varsayılan çıkarım yapamıyorsa Cloud Storage application/octet-stream kullanır. Bkz. Dosya Meta Verilerini Kullanma .

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. Duraklatma ve devam ettirme olayları sırasıyla pause ve progress durumu değişikliklerini artırır. Bir yüklemenin iptal edilmesi, yüklemenin iptal edildiğini belirten bir hata vererek 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 İlerlemesini İzleyin

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

Etkinlik tipi Tipik Kullanım
TaskState.running Veriler aktarılırken periyodik olarak yayınlanır ve bir yükleme/indirme göstergesini doldurmak için kullanılabilir.
TaskState.paused Görevin duraklatıldığı herhangi bir zamanda yayılır.
TaskState.success Görev başarıyla tamamlandığında yayılır.
TaskState.canceled Görevin iptal edildiği herhangi bir zamanda yayılır.
TaskState.error Yükleme başarısız olduğunda yayılır. Bunun nedeni ağ zaman aşımları, yetkilendirme hataları veya görevi iptal etmeniz olabilir.
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 yönetimi

Yerel dosyanın mevcut olmaması veya kullanıcının istenen dosyayı yükleme iznine sahip olmaması da dahil olmak üzere yükleme sırasında hataların ortaya çıkmasının çeşitli nedenleri vardır. Dokümanların Hataları İşleme bölümünde hatalar hakkında daha fazla bilgi bulabilirsiniz.

Tam Örnek

İlerleme izleme ve hata işleme özelliklerine sahip bir yüklemenin tam örneği aşağıda 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 artık bunları Cloud Storage'dan nasıl indireceğinizi öğrenelim.