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 آپلود کنید:
- آپلود از داده ها در حافظه
- آپلود از یک 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 دانلود کنیم.