بارگذاری فایل‌ها با Cloud Storage در پلاتفرم‌های Apple

‫Cloud Storage for Firebase به شما امکان می‌دهد فایل‌ها را به‌سرعت و به‌آسانی در Cloud Storage سطلی که توسط Firebase ارائه و مدیریت می‌شود بارگذاری کنید.

ایجاد مرجع

برای بارگذاری فایل، ابتدا مرجعی Cloud Storage ایجاد کنید به مکانی در Cloud Storage که می‌خواهید فایل را در آن بارگذاری کنید.

می‌توانید با افزودن مسیرهای فرزند به ریشه Cloud Storage مخزن خود مرجعی ایجاد کنید:

Swift

// Create a root reference
let storageRef = storage.reference()

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

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

// While the file names are the same, the references point to different files
mountainsRef.name == mountainImagesRef.name            // true
mountainsRef.fullPath == mountainImagesRef.fullPath    // false
    

Objective-C

// Create a root reference
FIRStorageReference *storageRef = [storage reference];

// Create a reference to "mountains.jpg"
FIRStorageReference *mountainsRef = [storageRef child:@"mountains.jpg"];

// Create a reference to 'images/mountains.jpg'
FIRStorageReference *mountainImagesRef = [storageRef child:@"images/mountains.jpg"];

// While the file names are the same, the references point to different files
[mountainsRef.name isEqualToString:mountainImagesRef.name];         // true
[mountainsRef.fullPath isEqualToString:mountainImagesRef.fullPath]; // false
  

نمی‌توانید داده‌هایی را با ارجاع به ریشه Cloud Storage مخزن خود بارگذاری کنید. مرجع شما باید به نشانی وب فرزند اشاره کند.

بارگذاری فایل‌ها

پس‌از اینکه مرجعی داشتید، می‌توانید فایل‌ها را به Cloud Storage به دو روش بارگذاری کنید:

  1. بارگذاری از داده‌های موجود در حافظه
  2. بارگذاری از نشانی وب نشان‌دهنده فایل در دستگاه

بارگذاری از داده‌های موجود در حافظه

روش putData:metadata:completion: ساده‌ترین راه برای بارگذاری فایل در Cloud Storage است. ‫putData:metadata:completion: یک شیء NSData می‌گیرد و یک FIRStorageUploadTask برمی‌گرداند که می‌توانید از آن برای مدیریت بارگذاری و نظارت بر وضعیت آن استفاده کنید.

Swift

// Data in memory
let data = Data()

// Create a reference to the file you want to upload
let riversRef = storageRef.child("images/rivers.jpg")

// Upload the file to the path "images/rivers.jpg"
let uploadTask = riversRef.putData(data, metadata: nil) { (metadata, error) in
  guard let metadata = metadata else {
    // Uh-oh, an error occurred!
    return
  }
  // Metadata contains file metadata such as size, content-type.
  let size = metadata.size
  // You can also access to download URL after upload.
  riversRef.downloadURL { (url, error) in
    guard let downloadURL = url else {
      // Uh-oh, an error occurred!
      return
    }
  }
}
    

Objective-C

// Data in memory
NSData *data = [NSData dataWithContentsOfFile:@"rivers.jpg"];

// Create a reference to the file you want to upload
FIRStorageReference *riversRef = [storageRef child:@"images/rivers.jpg"];

// Upload the file to the path "images/rivers.jpg"
FIRStorageUploadTask *uploadTask = [riversRef putData:data
                                             metadata:nil
                                           completion:^(FIRStorageMetadata *metadata,
                                                        NSError *error) {
  if (error != nil) {
    // Uh-oh, an error occurred!
  } else {
    // Metadata contains file metadata such as size, content-type, and download URL.
    int size = metadata.size;
    // You can also access to download URL after upload.
    [riversRef downloadURLWithCompletion:^(NSURL * _Nullable URL, NSError * _Nullable error) {
      if (error != nil) {
        // Uh-oh, an error occurred!
      } else {
        NSURL *downloadURL = URL;
      }
    }];
  }
}];
  

بارگذاری از فایل محلی

می‌توانید فایل‌های محلی در دستگاه‌ها، مانند عکس‌ها و ویدیوهای دوربین، را با روش putFile:metadata:completion: بارگذاری کنید. ‫putFile:metadata:completion: یک NSURL می‌گیرد و یک FIRStorageUploadTask برمی‌گرداند که می‌توانید از آن برای مدیریت بارگذاری و نظارت بر وضعیت آن استفاده کنید.

Swift

// File located on disk
let localFile = URL(string: "path/to/image")!

// Create a reference to the file you want to upload
let riversRef = storageRef.child("images/rivers.jpg")

// Upload the file to the path "images/rivers.jpg"
let uploadTask = riversRef.putFile(from: localFile, metadata: nil) { metadata, error in
  guard let metadata = metadata else {
    // Uh-oh, an error occurred!
    return
  }
  // Metadata contains file metadata such as size, content-type.
  let size = metadata.size
  // You can also access to download URL after upload.
  riversRef.downloadURL { (url, error) in
    guard let downloadURL = url else {
      // Uh-oh, an error occurred!
      return
    }
  }
}
    

Objective-C

// File located on disk
NSURL *localFile = [NSURL URLWithString:@"path/to/image"];

// Create a reference to the file you want to upload
FIRStorageReference *riversRef = [storageRef child:@"images/rivers.jpg"];

// Upload the file to the path "images/rivers.jpg"
FIRStorageUploadTask *uploadTask = [riversRef putFile:localFile metadata:nil completion:^(FIRStorageMetadata *metadata, NSError *error) {
  if (error != nil) {
    // Uh-oh, an error occurred!
  } else {
    // Metadata contains file metadata such as size, content-type, and download URL.
    int size = metadata.size;
    // You can also access to download URL after upload.
    [riversRef downloadURLWithCompletion:^(NSURL * _Nullable URL, NSError * _Nullable error) {
      if (error != nil) {
        // Uh-oh, an error occurred!
      } else {
        NSURL *downloadURL = URL;
      }
    }];
  }
}];
  

اگر می‌خواهید بارگذاری خود را به‌صورت فعال مدیریت کنید، می‌توانید از روش‌های putData: یا putFile: استفاده کنید و به‌جای استفاده از مدیریت‌کننده تکمیل، وظیفه بارگذاری را مشاهده کنید. برای اطلاعات بیشتر، مدیریت بارگذاری‌ها را ببینید.

افزودن فراداده فایل

همچنین می‌توانید هنگام بارگذاری فایل‌ها، فراداده اضافه کنید. این فراداده حاوی ویژگی‌های فراداده فایل معمولی مانند name، size، و contentType (که معمولاً به‌عنوان نوع MIME شناخته می‌شود) است. روش putFile: به‌طور خودکار نوع محتوا را از NSURL پسوند نام فایل استنباط می‌کند، اما می‌توانید با مشخص کردن contentType در فراداده، نوع شناسایی‌شده خودکار را ملغی کنید. اگر contentType ارائه ندهید و Cloud Storage نتواند پیش‌فرض را از پسوند فایل استنباط کند، Cloud Storage از application/octet-stream استفاده می‌کند. برای اطلاعات بیشتر درباره فراداده فایل، بخش استفاده از فراداده فایل را ببینید.

Swift

// Create storage reference
let mountainsRef = storageRef.child("images/mountains.jpg")

// Create file metadata including the content type
let metadata = StorageMetadata()
metadata.contentType = "image/jpeg"

// Upload data and metadata
mountainsRef.putData(data, metadata: metadata)

// Upload file and metadata
mountainsRef.putFile(from: localFile, metadata: metadata)
    

Objective-C

// Create storage reference
FIRStorageReference *mountainsRef = [storageRef child:@"images/mountains.jpg"];

// Create file metadata including the content type
FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] init];
metadata.contentType = @"image/jpeg";

// Upload data and metadata
FIRStorageUploadTask *uploadTask = [mountainsRef putData:data metadata:metadata];

// Upload file and metadata
uploadTask = [mountainsRef putFile:localFile metadata:metadata];
  

مدیریت بارگذاری‌ها

علاوه‌بر شروع بارگذاری‌ها، می‌توانید بااستفاده از روش‌های pause، resume، و cancel بارگذاری‌ها را موقتاً متوقف کنید، ازسر بگیرید، و لغو کنید. این روش‌ها رویدادهای pause، resume، و cancel را افزایش می‌دهند. لغو کردن بارگذاری باعث می‌شود بارگذاری با خطایی که نشان می‌دهد بارگذاری لغو شده است، ناموفق شود.

Swift

// Start uploading a file
let uploadTask = storageRef.putFile(from: localFile)

// Pause the upload
uploadTask.pause()

// Resume the upload
uploadTask.resume()

// Cancel the upload
uploadTask.cancel()
    

Objective-C

// Start uploading a file
FIRStorageUploadTask *uploadTask = [storageRef putFile:localFile];

// Pause the upload
[uploadTask pause];

// Resume the upload
[uploadTask resume];

// Cancel the upload
[uploadTask cancel];
  

نظارت بر پیشرفت بارگذاری

می‌توانید ناظران را به FIRStorageUploadTask پیوست کنید تا بر پیشرفت بارگذاری نظارت کنند. افزودن ناظر FIRStorageHandle برمی‌گرداند که می‌توان از آن برای برداشتن ناظر استفاده کرد.

Swift

// Add a progress observer to an upload task
let observer = uploadTask.observe(.progress) { snapshot in
  // A progress event occured
}
    

Objective-C

// Add a progress observer to an upload task
NSString *observer = [uploadTask observeStatus:FIRStorageTaskStatusProgress
                                        handler:^(FIRStorageTaskSnapshot *snapshot) {
  // A progress event occurred
}];
  

این ناظران را می‌توان به رویداد FIRStorageTaskStatus اضافه کرد:

‫FIRStorageTaskStatus رویداد مصرف معمول
FIRStorageTaskStatusResume این رویداد زمانی فعال می‌شود که تکلیف شروع به بارگذاری می‌کند یا بارگذاری را ازسر می‌گیرد، و اغلب همراه با رویداد FIRStorageTaskStatusPause استفاده می‌شود.
FIRStorageTaskStatusProgress این رویداد هر زمان که داده‌ها درحال بارگذاری در Cloud Storage باشد فعال می‌شود و می‌توان از آن برای پر کردن نشانگر پیشرفت بارگذاری استفاده کرد.
FIRStorageTaskStatusPause این رویداد هر زمان که بارگذاری موقتاً متوقف شود، فعال می‌شود و اغلب همراه با رویداد FIRStorageTaskStatusResume استفاده می‌شود.
FIRStorageTaskStatusSuccess این رویداد زمانی فعال می‌شود که بارگذاری باموفقیت تکمیل شود.
FIRStorageTaskStatusFailure این رویداد زمانی فعال می‌شود که بارگذاری ناموفق باشد. برای تعیین دلیل خطا، آن را بازرسی کنید.

وقتی رویدادی رخ می‌دهد، شیء FIRStorageTaskSnapshot برگردانده می‌شود. این نمای فوری نمای تغییرناپذیری از تکلیف در زمان وقوع رویداد است. این شیء شامل ویژگی‌های زیر است:

دارایی نوع شرح
progress NSProgress یک شیء NSProgress حاوی پیشرفت بارگذاری.
error NSError خطایی که درطول بارگذاری رخ داده است، درصورت وجود.
metadata FIRStorageMetadata درحین بارگذاری حاوی فراداده‌هایی است که درحال بارگذاری است. پس‌از رویداد FIRTaskStatusSuccess، حاوی فراداده فایل بارگذاری‌شده است.
task FIRStorageUploadTask تکلیفی که این عکس آنی از آن گرفته شده است و می‌توان از آن برای مدیریت تکلیف (pause،‏ resume،‏ cancel) استفاده کرد.
reference FIRStorageReference مرجعی که این تکلیف از آن آمده است.

همچنین می‌توانید ناظران را به‌صورت جداگانه، براساس وضعیت، یا با برداشتن همه آن‌ها بردارید.

Swift

// Create a task listener handle
let observer = uploadTask.observe(.progress) { snapshot in
  // A progress event occurred
}

// Remove an individual observer
uploadTask.removeObserver(withHandle: observer)

// Remove all observers of a particular status
uploadTask.removeAllObservers(for: .progress)

// Remove all observers
uploadTask.removeAllObservers()
    

Objective-C

// Create a task listener handle
NSString *observer = [uploadTask observeStatus:FIRStorageTaskStatusProgress
                                       handler:^(FIRStorageTaskSnapshot *snapshot) {
  // A progress event occurred
}];

// Remove an individual observer
[uploadTask removeObserverWithHandle:observer];

// Remove all observers of a particular status
[uploadTask removeAllObserversForStatus:FIRStorageTaskStatusProgress];

// Remove all observers
[uploadTask removeAllObservers];
  

برای جلوگیری از نشت حافظه، همه ناظران پس‌از وقوع FIRStorageTaskStatusSuccess یا FIRStorageTaskStatusFailure برداشته می‌شوند.

مدیریت کردن خطا

دلایل متعددی وجود دارد که ممکن است خطاها در بارگذاری رخ دهند، ازجمله عدم وجود فایل محلی، یا نداشتن اجازه کاربر برای بارگذاری فایل موردنظر. می‌توانید اطلاعات بیشتری درباره خطاها در بخش مدیریت خطاها سندنگارها پیدا کنید.

نمونه کامل

نمونه کامل بارگذاری با پایش پیشرفت و مدیریت خطا در زیر نشان داده شده است:

Swift

// Local file you want to upload
let localFile = URL(string: "path/to/image")!

// Create the file metadata
let metadata = StorageMetadata()
metadata.contentType = "image/jpeg"

// Upload file and metadata to the object 'images/mountains.jpg'
let uploadTask = storageRef.putFile(from: localFile, metadata: metadata)

// Listen for state changes, errors, and completion of the upload.
uploadTask.observe(.resume) { snapshot in
  // Upload resumed, also fires when the upload starts
}

uploadTask.observe(.pause) { snapshot in
  // Upload paused
}

uploadTask.observe(.progress) { snapshot in
  // Upload reported progress
  let percentComplete = 100.0 * Double(snapshot.progress!.completedUnitCount)
    / Double(snapshot.progress!.totalUnitCount)
}

uploadTask.observe(.success) { snapshot in
  // Upload completed successfully
}

uploadTask.observe(.failure) { snapshot in
  if let error = snapshot.error as? NSError {
    switch (StorageErrorCode(rawValue: error.code)!) {
    case .objectNotFound:
      // File doesn't exist
      break
    case .unauthorized:
      // User doesn't have permission to access file
      break
    case .cancelled:
      // User canceled the upload
      break

    /* ... */

    case .unknown:
      // Unknown error occurred, inspect the server response
      break
    default:
      // A separate error occurred. This is a good place to retry the upload.
      break
    }
  }
}
    

Objective-C

// Local file you want to upload
NSURL *localFile = [NSURL URLWithString:@"path/to/image"];

// Create the file metadata
FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] init];
metadata.contentType = @"image/jpeg";

// Upload file and metadata to the object 'images/mountains.jpg'
FIRStorageUploadTask *uploadTask = [storageRef putFile:localFile metadata:metadata];

// Listen for state changes, errors, and completion of the upload.
[uploadTask observeStatus:FIRStorageTaskStatusResume handler:^(FIRStorageTaskSnapshot *snapshot) {
  // Upload resumed, also fires when the upload starts
}];

[uploadTask observeStatus:FIRStorageTaskStatusPause handler:^(FIRStorageTaskSnapshot *snapshot) {
  // Upload paused
}];

[uploadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) {
  // Upload reported progress
  double percentComplete = 100.0 * (snapshot.progress.completedUnitCount) / (snapshot.progress.totalUnitCount);
}];

[uploadTask observeStatus:FIRStorageTaskStatusSuccess handler:^(FIRStorageTaskSnapshot *snapshot) {
  // Upload completed successfully
}];

// Errors only occur in the "Failure" case
[uploadTask observeStatus:FIRStorageTaskStatusFailure handler:^(FIRStorageTaskSnapshot *snapshot) {
  if (snapshot.error != nil) {
    switch (snapshot.error.code) {
      case FIRStorageErrorCodeObjectNotFound:
        // File doesn't exist
        break;

      case FIRStorageErrorCodeUnauthorized:
        // User doesn't have permission to access file
        break;

      case FIRStorageErrorCodeCancelled:
        // User canceled the upload
        break;

      /* ... */

      case FIRStorageErrorCodeUnknown:
        // Unknown error occurred, inspect the server response
        break;
    }
  }
}];
  

اکنون که فایل‌ها را بارگذاری کرده‌اید، بیایید با نحوه بارگیری آن‌ها از Cloud Storage آشنا شویم.