使用 iOS SDK 将文件上传到 Firebase 时,上传总计数为 0
Total upload count is 0 when uploading file to Firebase using iOS SDK
我想在将 iOS 应用中录制的视频文件上传到 Firebase 时向用户显示进度条,因此我使用了 SDK 的 observeStatus
功能:
// Create a root reference
FIRStorageReference *storageRef = [_storage reference];
// Create a reference to the video
FIRStorageReference *videoRef = [storageRef child:uuidString];
// Upload the file
FIRStorageUploadTask* uploadTask = [videoRef putFile:url metadata:nil];
[uploadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) {
// A progress event occurred
double percentComplete = 100.0 * (snapshot.progress.completedUnitCount) / (snapshot.progress.totalUnitCount);
NSLog(@"Video with ID %d recording upload progress: %f, completed unit count %lld, total unit count %lld", video.videoId, percentComplete, snapshot.progress.completedUnitCount, snapshot.progress.totalUnitCount);
}];
然而,'Total Unit Count' 似乎总是 0,这意味着计算的完成百分比在整个除以 0 的情况下有点疯狂:
Video with ID 3 recording upload progress: inf, completed unit count 163922, total unit count 0
我是不是做错了什么?按照 here.
中描述的文档进行操作
[也在 Swift 中复制]
已编辑
使用 data
上传工作正常:
NSData *data = // ... some real data to upload
FIRStorageReference *storageRef = [storage referenceForURL:@"gs://<YOURPATH>"];
// Upload the file to the path
FIRStorageUploadTask *uploadTask = [storageRef putData:data metadata:nil completion:^(FIRStorageMetadata * _Nullable metadata, NSError * _Nullable error) {
if (error != nil) {
// Error handle it
} else {
NSString *urlToDownload = metadata.downloadURL;
}
}];
// Add a progress observer to an upload task
[uploadTask observeStatus:FIRStorageTaskStatusProgress
handler:^(FIRStorageTaskSnapshot *snapshot) {
// A progress event occurred
double percentComplete = 100.0 * (snapshot.progress.completedUnitCount) / (snapshot.progress.totalUnitCount);
NSLog(@"\n\nloading...%f",percentComplete);
}];
我希望这可以帮助 OP 或其他任何人。
这不是我们想要的答案,但我猜 Firebase SDK 中存在错误,它无法正确创建 NSProgress
实例。
因此,作为解决方法,您可以在创建上传任务之前捕获文件大小。我正在使用这个扩展(为了方便起见,它与 IUO 超级崩溃)。
extension NSFileManager {
func fileSize(atUrl url: NSURL) -> Int64 {
return try! NSFileManager.defaultManager().attributesOfItemAtPath(url.path!)[NSFileSize]!.longLongValue
}
}
捕获文件大小值并在计算中使用该值代替 totalUnitCount
。
FWIW 我在 https://firebase.google.com/support/contact/bugs-features/
上针对这个问题提交了错误
我们实际上正确地创建了 NSProgress
,并针对内存中的上传适当地更新了它 (putData
),但是没有获取文件上传的文件大小 (putFile
)因为显然我没有发现文件 attributes/they 并不总是正确的。
我正在尽快修复,现在您可以使用 NSFileManager.defaultManager().attributesOfItemAtPath(url.path!)[NSFileSize]!.longLongValue
解决方法来获取文件大小:)
编辑 (10/10/16):这个问题已经解决,如果你使用最新版本的 Firebase Storage,你不会有这个问题:)
我想在将 iOS 应用中录制的视频文件上传到 Firebase 时向用户显示进度条,因此我使用了 SDK 的 observeStatus
功能:
// Create a root reference
FIRStorageReference *storageRef = [_storage reference];
// Create a reference to the video
FIRStorageReference *videoRef = [storageRef child:uuidString];
// Upload the file
FIRStorageUploadTask* uploadTask = [videoRef putFile:url metadata:nil];
[uploadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) {
// A progress event occurred
double percentComplete = 100.0 * (snapshot.progress.completedUnitCount) / (snapshot.progress.totalUnitCount);
NSLog(@"Video with ID %d recording upload progress: %f, completed unit count %lld, total unit count %lld", video.videoId, percentComplete, snapshot.progress.completedUnitCount, snapshot.progress.totalUnitCount);
}];
然而,'Total Unit Count' 似乎总是 0,这意味着计算的完成百分比在整个除以 0 的情况下有点疯狂:
Video with ID 3 recording upload progress: inf, completed unit count 163922, total unit count 0
我是不是做错了什么?按照 here.
中描述的文档进行操作[也在 Swift 中复制]
已编辑
使用 data
上传工作正常:
NSData *data = // ... some real data to upload
FIRStorageReference *storageRef = [storage referenceForURL:@"gs://<YOURPATH>"];
// Upload the file to the path
FIRStorageUploadTask *uploadTask = [storageRef putData:data metadata:nil completion:^(FIRStorageMetadata * _Nullable metadata, NSError * _Nullable error) {
if (error != nil) {
// Error handle it
} else {
NSString *urlToDownload = metadata.downloadURL;
}
}];
// Add a progress observer to an upload task
[uploadTask observeStatus:FIRStorageTaskStatusProgress
handler:^(FIRStorageTaskSnapshot *snapshot) {
// A progress event occurred
double percentComplete = 100.0 * (snapshot.progress.completedUnitCount) / (snapshot.progress.totalUnitCount);
NSLog(@"\n\nloading...%f",percentComplete);
}];
我希望这可以帮助 OP 或其他任何人。
这不是我们想要的答案,但我猜 Firebase SDK 中存在错误,它无法正确创建 NSProgress
实例。
因此,作为解决方法,您可以在创建上传任务之前捕获文件大小。我正在使用这个扩展(为了方便起见,它与 IUO 超级崩溃)。
extension NSFileManager {
func fileSize(atUrl url: NSURL) -> Int64 {
return try! NSFileManager.defaultManager().attributesOfItemAtPath(url.path!)[NSFileSize]!.longLongValue
}
}
捕获文件大小值并在计算中使用该值代替 totalUnitCount
。
FWIW 我在 https://firebase.google.com/support/contact/bugs-features/
上针对这个问题提交了错误我们实际上正确地创建了 NSProgress
,并针对内存中的上传适当地更新了它 (putData
),但是没有获取文件上传的文件大小 (putFile
)因为显然我没有发现文件 attributes/they 并不总是正确的。
我正在尽快修复,现在您可以使用 NSFileManager.defaultManager().attributesOfItemAtPath(url.path!)[NSFileSize]!.longLongValue
解决方法来获取文件大小:)
编辑 (10/10/16):这个问题已经解决,如果你使用最新版本的 Firebase Storage,你不会有这个问题:)