فایل‌ها را با فضای ذخیره‌سازی ابری در پلتفرم‌های اپل آپلود کنید

Cloud Storage for Firebase به شما این امکان را می دهد که به سرعت و به راحتی فایل ها را در یک سطل Cloud Storage که توسط Firebase تهیه و مدیریت می شود آپلود کنید.

یک مرجع ایجاد کنید

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

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

سویفت

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

هدف-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. آپلود از یک URL نشان دهنده یک فایل در دستگاه

آپلود از داده ها در حافظه

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

سویفت

// 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
    }
  }
}
    

هدف-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 را برمی گرداند که می توانید از آن برای مدیریت آپلود و نظارت بر وضعیت آن استفاده کنید.

سویفت

// 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
    }
  }
}
    

هدف-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 استفاده می کند. برای اطلاعات بیشتر در مورد فراداده فایل به بخش Use File Metadata مراجعه کنید.

سویفت

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

هدف-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 ، ازسرگیری و cancel آپلودها را موقتاً متوقف، resume و لغو کنید. این روش‌ها باعث افزایش pause ، resume و cancel رویدادها می‌شوند. لغو آپلود باعث می شود که آپلود با خطایی که نشان می دهد آپلود لغو شده است با شکست مواجه شود.

سویفت

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

هدف-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 را برمی‌گرداند که می‌توان از آن برای حذف ناظر استفاده کرد.

سویفت

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

هدف-C

// Add a progress observer to an upload task
FIRStorageHandle 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 مرجعی که این وظیفه از آنجا آمده است.

همچنین می توانید ناظران را به صورت جداگانه، بر اساس وضعیت یا با حذف همه آنها حذف کنید.

سویفت

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

هدف-C

// Create a task listener handle
FIRStorageHandle 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 ، همه مشاهدهگرها حذف می شوند.

رسیدگی به خطا

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

مثال کامل

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

سویفت

// 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
    }
  }
}
    

هدف-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 دانلود کنیم.

،

Cloud Storage for Firebase به شما این امکان را می دهد که به سرعت و به راحتی فایل ها را در یک سطل Cloud Storage که توسط Firebase تهیه و مدیریت می شود آپلود کنید.

یک مرجع ایجاد کنید

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

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

سویفت

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

هدف-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. آپلود از یک URL نشان دهنده یک فایل در دستگاه

آپلود از داده ها در حافظه

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

سویفت

// 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
    }
  }
}
    

هدف-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 را برمی گرداند که می توانید از آن برای مدیریت آپلود و نظارت بر وضعیت آن استفاده کنید.

سویفت

// 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
    }
  }
}
    

هدف-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 استفاده می کند. برای اطلاعات بیشتر در مورد فراداده فایل به بخش Use File Metadata مراجعه کنید.

سویفت

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

هدف-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 ، ازسرگیری و cancel آپلودها را موقتاً متوقف، resume و لغو کنید. این روش‌ها باعث افزایش pause ، resume و cancel رویدادها می‌شوند. لغو آپلود باعث می شود که آپلود با خطایی که نشان می دهد آپلود لغو شده است با شکست مواجه شود.

سویفت

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

هدف-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 را برمی‌گرداند که می‌توان از آن برای حذف ناظر استفاده کرد.

سویفت

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

هدف-C

// Add a progress observer to an upload task
FIRStorageHandle 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 مرجعی که این وظیفه از آنجا آمده است.

همچنین می توانید ناظران را به صورت جداگانه، بر اساس وضعیت یا با حذف همه آنها حذف کنید.

سویفت

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

هدف-C

// Create a task listener handle
FIRStorageHandle 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 ، همه مشاهدهگرها حذف می شوند.

رسیدگی به خطا

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

مثال کامل

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

سویفت

// 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
    }
  }
}
    

هدف-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 دانلود کنیم.

،

Cloud Storage for Firebase به شما این امکان را می دهد که به سرعت و به راحتی فایل ها را در یک سطل Cloud Storage که توسط Firebase تهیه و مدیریت می شود آپلود کنید.

یک مرجع ایجاد کنید

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

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

سویفت

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

هدف-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. آپلود از یک URL نشان دهنده یک فایل در دستگاه

آپلود از داده ها در حافظه

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

سویفت

// 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
    }
  }
}
    

هدف-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 را برمی گرداند که می توانید از آن برای مدیریت آپلود و نظارت بر وضعیت آن استفاده کنید.

سویفت

// 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
    }
  }
}
    

هدف-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 استفاده می کند. برای اطلاعات بیشتر در مورد فراداده فایل به بخش Use File Metadata مراجعه کنید.

سویفت

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

هدف-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 ، ازسرگیری و cancel آپلودها را موقتاً متوقف، resume و لغو کنید. این روش‌ها باعث افزایش pause ، resume و cancel رویدادها می‌شوند. لغو آپلود باعث می شود که آپلود با خطایی که نشان می دهد آپلود لغو شده است با شکست مواجه شود.

سویفت

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

هدف-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 را برمی‌گرداند که می‌توان از آن برای حذف ناظر استفاده کرد.

سویفت

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

هدف-C

// Add a progress observer to an upload task
FIRStorageHandle 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 مرجعی که این وظیفه از آنجا آمده است.

همچنین می توانید ناظران را به صورت جداگانه، بر اساس وضعیت یا با حذف همه آنها حذف کنید.

سویفت

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

هدف-C

// Create a task listener handle
FIRStorageHandle 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 ، همه مشاهدهگرها حذف می شوند.

رسیدگی به خطا

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

مثال کامل

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

سویفت

// 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
    }
  }
}
    

هدف-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 دانلود کنیم.