Flutter-এ Cloud Storage-এর মাধ্যমে ফাইল আপলোড করা

Firebase-এর জন্য ক্লাউড স্টোরেজ আপনাকে Firebase-এর দেওয়া ও ম্যানেজ করা ক্লাউড স্টোরেজ বাকেটে দ্রুত ও সহজে ফাইল আপলোড করতে দেয়।

ফাইলগুলি আপলোড করুন

Cloud Storage-এ কোনও ফাইল আপলোড করতে, আপনাকে প্রথমে ফাইলের সম্পূর্ণ পাথের একটি রেফারেন্স তৈরি করতে হবে, যার মধ্যে ফাইলের নামও অন্তর্ভুক্ত।

// 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);

আপনি উপযুক্ত রেফারেন্স তৈরি করার পরে, Cloud Storage-এ ফাইল আপলোড করতে putFile(), putString() বা putData() মেথড কল করুন।

আপনার Cloud Storage বাকেটের রুটের রেফারেন্স সহ ডেটা আপলোড করতে পারবেন না। আপনার রেফারেন্স অবশ্যই কোনও চাইল্ড URL-এর দিকে নির্দেশ করবে।

ফাইল থেকে আপলোড করা

কোনও ফাইল আপলোড করতে, আপনাকে প্রথমে ডিভাইসে সেটির লোকেশন সংক্রান্ত সম্পূর্ণ পাথ পেতে হবে। যেমন, কোনও ফাইল যদি অ্যাপ্লিকেশন ডকুমেন্টের ডিরেক্টরির মধ্যে থাকে, তাহলে ফাইল পাথ জেনারেট করতে এবং সেটি putFile()-এ পাস করতে, অফিসিয়াল path_provider প্যাকেজ ব্যবহার করুন:

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

স্ট্রিং থেকে আপলোড করা

আপনি putString() পদ্ধতি ব্যবহার করে কাঁচা, base64, base64url বা data_url এনকোডেড স্ট্রিং হিসেবে ডেটা আপলোড করতে পারবেন। যেমন, ডেটা URL হিসেবে এনকোড করা টেক্সট স্ট্রিং আপলোড করতে:

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

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

অশোধিত ডেটা আপলোড করা

যেসব ক্ষেত্রে স্ট্রিং বা File আপলোড করা সম্ভব নয়, সেইসব ক্ষেত্রে আপনি Uint8List ফর্ম্যাটে লোয়ার-লেভেল টাইপ করা ডেটা আপলোড করতে পারবেন। এই ক্ষেত্রে, আপনার ডেটা সহ putData() মেথডকে কল করুন:

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

ডাউনলোড URL পাওয়া

কোনও ফাইল আপলোড করার পরে, আপনি Reference-এ getDownloadUrl() পদ্ধতি কল করে ফাইলটি ডাউনলোড করার জন্য একটি URL পেতে পারেন:

await mountainsRef.getDownloadURL();

ফাইলের মেটাডেটা যোগ করা

এছাড়াও, ফাইল আপলোড করার সময় আপনি মেটাডেটা যোগ করতে পারবেন। এই মেটাডেটাতে সাধারণ ফাইল মেটাডেটা প্রপার্টি থাকে, যেমন contentType (সাধারণত MIME টাইপ হিসেবে উল্লেখ করা হয়)। putFile() পদ্ধতি File এক্সটেনশন থেকে অটোমেটিক MIME-এর ধরন অনুমান করে, কিন্তু আপনি মেটাডেটাতে contentType উল্লেখ করে অটোমেটিক শনাক্ত করা ধরন ওভাররাইড করতে পারেন। আপনি contentType না দিলে এবং Cloud Storage ফাইল এক্সটেনশন থেকে কোনও ডিফল্ট অনুমান করতে না পারলে, Cloud Storage application/octet-stream ব্যবহার করে। ফাইল মেটাডেটা ব্যবহার করা দেখুন।

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

আপলোড ম্যানেজ করা

আপলোড শুরু করা ছাড়াও, আপনি pause(), resume() এবং cancel() পদ্ধতি ব্যবহার করে আপলোড পজ, আবার চালু ও বাতিল করতে পারেন। ইভেন্ট পজ ও আবার চালু করলে pause ও progress স্টেট পরিবর্তন হয়। আপলোড বাতিল করলে, আপলোডটি একটি সমস্যার কারণে সম্পূর্ণ হয় না। সমস্যাটি থেকে বোঝা যায় যে আপলোডটি বাতিল করা হয়েছে।

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');

আপলোড প্রগ্রেস মনিটর করা

আপনার আপলোড টাস্কের সাফল্য, ব্যর্থতা, অগ্রগতি বা পজ হ্যান্ডেল করতে, আপনি টাস্কের ইভেন্ট স্ট্রিম শুনতে পারেন:

ইভেন্টের ধরন সাধারণ ব্যবহার
TaskState.running ডেটা ট্রান্সফার করার সময় মাঝে মাঝে নির্গমন করা হয় এবং আপলোড/ডাউনলোড ইন্ডিকেটর পূরণ করার জন্য ব্যবহার করা যেতে পারে।
TaskState.paused টাস্ক পজ করা হলে যেকোনও সময় এমিট করা হয়।
TaskState.success টাস্ক সম্পূর্ণ হয়ে গেলে এটি নির্গত হয়।
TaskState.canceled টাস্ক বাতিল করা হলে যেকোনও সময় এটি নির্গমন করা হয়।
TaskState.error আপলোড করা না গেলে এটি নির্গত হয়। নেটওয়ার্ক টাইম-আউট, অনুমোদন না পাওয়া বা আপনি টাস্ক বাতিল করলে এটি হতে পারে।
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;
  }
});

সমস্যা ম্যানেজ করা

আপলোড করার সময় বিভিন্ন কারণে সমস্যা হতে পারে, যেমন লোকাল ফাইল না থাকা অথবা ব্যবহারকারীর কাছে কাঙ্খিত ফাইল আপলোড করার অনুমতি না থাকা। আপনি ডকুমেন্টেশনের সমস্যা সমাধান করুন বিভাগে সমস্যা সম্পর্কে আরও তথ্য পাবেন।

সম্পূর্ণ উদাহরণ

প্রগ্রেস মনিটর করা ও সমস্যার সমাধান করা সহ আপলোডের একটি সম্পূর্ণ উদাহরণ নিচে দেখানো হল:

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;
  }
});

আপনি যেহেতু ফাইল আপলোড করেছেন, তাই Cloud Storage থেকে কীভাবে সেগুলি ডাউনলোড করবেন তা আসুন জেনে নেওয়া যাক।