Cloud Storage for Firebase cho phép bạn nhanh chóng và dễ dàng tải tệp lên một bộ chứa Cloud Storage do Firebase cung cấp và quản lý.
Tạo tệp đối chiếu
Để tải một tệp lên, trước tiên tạo một tệp đối chiếu Cloud Storage vào vị trí trong Cloud Storage mà bạn muốn tải tệp lên.
Bạn có thể tạo tham chiếu bằng cách thêm đường dẫn con vào thư mục gốc của Cloud Storage bộ chứa:
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
Bạn không thể tải lên dữ liệu có tham chiếu đến thư mục gốc của Cloud Storage bộ chứa. Tham chiếu của bạn phải trỏ đến một URL con.
Tải tệp lên
Sau khi có tệp tham chiếu, bạn có thể tải tệp lên Cloud Storage bằng hai cách:
- Tải lên từ dữ liệu trong bộ nhớ
- Tải lên từ một URL biểu thị một tệp trên thiết bị
Tải lên từ dữ liệu trong bộ nhớ
Phương thức putData:metadata:completion:
là cách đơn giản nhất để tải tệp lên Cloud Storage. putData:metadata:completion:
lấy một NSData
và trả về một FIRStorageUploadTask
mà bạn có thể dùng để quản lý
tải lên và theo dõi trạng thái của tệp.
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; } }]; } }];
Tải lên từ một tệp trên máy
Bạn có thể tải các tệp cục bộ trên thiết bị lên, chẳng hạn như ảnh và video từ máy ảnh, bằng phương thức putFile:metadata:completion:
.
putFile:metadata:completion:
nhận NSURL
và trả về một
FIRStorageUploadTask
mà bạn có thể sử dụng để quản lý quá trình tải lên và giám sát
trạng thái.
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; } }]; } }];
Nếu muốn chủ động quản lý tệp tải lên, bạn có thể sử dụng putData:
hoặc
putFile:
và quan sát tác vụ tải lên, thay vì sử dụng
trình xử lý hoàn thành. Hãy xem phần Quản lý nội dung tải lên để biết thêm thông tin.
Thêm siêu dữ liệu tệp
Bạn cũng có thể thêm siêu dữ liệu khi tải tệp lên.
Siêu dữ liệu này chứa các thuộc tính siêu dữ liệu của tệp điển hình như name
, size
,
và contentType
(thường được gọi là loại MIME). Phương thức putFile:
tự động suy luận loại nội dung từ đuôi tệp NSURL
, nhưng bạn có thể ghi đè loại được phát hiện tự động bằng cách chỉ định contentType
trong siêu dữ liệu. Nếu bạn không cung cấp contentType
và Cloud Storage
không thể suy ra giá trị mặc định từ đuôi tệp, Cloud Storage sử dụng
application/octet-stream
. Hãy xem phần Sử dụng siêu dữ liệu tệp để biết thêm thông tin về siêu dữ liệu tệp.
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];
Quản lý tải lên
Ngoài việc bắt đầu tải lên, bạn có thể tạm dừng, tiếp tục và huỷ quá trình tải lên bằng cách sử dụng
phương thức pause
, resume
và cancel
. Các phương thức này sẽ nâng pause
,
Sự kiện resume
và cancel
. Việc huỷ quá trình tải lên sẽ khiến quá trình tải lên đó không thành công
có lỗi cho biết quá trình tải lên đã bị huỷ.
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];
Theo dõi tiến trình tải lên
Bạn có thể đính kèm đối tượng tiếp nhận dữ liệu vào FIRStorageUploadTask
để giám sát
tiến trình tải lên. Việc thêm trình quan sát sẽ trả về FIRStorageHandle
có thể dùng để xoá trình quan sát.
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 FIRStorageHandle observer = [uploadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) { // A progress event occurred }];
Bạn có thể thêm những người quan sát này vào sự kiện FIRStorageTaskStatus
:
FIRStorageTaskStatus sự kiện |
Cách sử dụng thông thường |
---|---|
FIRStorageTaskStatusResume |
Sự kiện này kích hoạt khi tác vụ bắt đầu hoặc tiếp tục tải lên và thường được dùng cùng với sự kiện FIRStorageTaskStatusPause . |
FIRStorageTaskStatusProgress |
Sự kiện này sẽ kích hoạt bất cứ khi nào dữ liệu được tải lên Cloud Storage và có thể được dùng để điền chỉ báo tiến trình tải lên. |
FIRStorageTaskStatusPause |
Sự kiện này sẽ kích hoạt bất cứ khi nào việc tải lên bị tạm dừng và thường được dùng cùng với sự kiện FIRStorageTaskStatusResume . |
FIRStorageTaskStatusSuccess |
Sự kiện này kích hoạt khi quá trình tải lên đã hoàn tất. |
FIRStorageTaskStatusFailure |
Sự kiện này kích hoạt khi quá trình tải lên không thành công. Kiểm tra lỗi để xác định lý do không thành công. |
Khi một sự kiện xảy ra, đối tượng FIRStorageTaskSnapshot
sẽ được trả về. Ảnh chụp nhanh này là một chế độ xem không thể thay đổi của tác vụ, tại thời điểm sự kiện xảy ra.
Đối tượng này chứa các thuộc tính sau:
Tài sản | Loại | Mô tả |
---|---|---|
progress |
NSProgress |
Một đối tượng NSProgress chứa tiến trình tải lên. |
error |
NSError |
Đã xảy ra lỗi trong khi tải lên, nếu có. |
metadata |
FIRStorageMetadata |
Trong quá trình tải lên có chứa siêu dữ liệu đang được tải lên. Sau sự kiện FIRTaskStatusSuccess , chứa siêu dữ liệu của tệp đã tải lên. |
task |
FIRStorageUploadTask |
Công việc là thông tin tổng quan nhanh và có thể dùng để quản lý (pause , resume , cancel ) công việc. |
reference |
FIRStorageReference |
Nguồn tham chiếu của việc cần làm này. |
Bạn cũng có thể xoá từng người quan sát, theo trạng thái hoặc bằng cách xoá tất cả các nguyên tắc đó.
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 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];
Để ngăn rò rỉ bộ nhớ, tất cả trình quan sát sẽ bị xoá sau
FIRStorageTaskStatusSuccess
hoặc FIRStorageTaskStatusFailure
xảy ra.
Lỗi xử lý
Có một số lý do khiến lỗi có thể xảy ra khi tải lên, bao gồm tệp cục bộ không tồn tại hoặc người dùng không có quyền tải lên tệp mong muốn. Bạn có thể tìm thêm thông tin về các lỗi trong phần Xử lý lỗi của phần Tài liệu.
Ví dụ đầy đủ
Ví dụ đầy đủ về một tệp tải lên có tính năng theo dõi tiến trình và xử lý lỗi được hiển thị dưới đây:
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; } } }];
Giờ bạn đã tải tệp lên, hãy tìm hiểu cách tải chúng xuống từ Cloud Storage.