3

在将 iOS 应用中录制的视频文件上传到 Firebase 时,我想向用户显示一个进度条,因此我使用observeStatus了 SDK 的功能:

// 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);
}];

但是,“总单位数”似乎总是为 0,这意味着计算的完成百分比在整个除以 0 的情况下有点疯狂:

Video with ID 3 recording upload progress: inf, completed unit count 163922, total unit count 0

难道我做错了什么?遵循此处描述的文档。

[也在 Swift 中复制]

4

3 回答 3

1

已编辑

使用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或其他任何人。

于 2016-06-03T01:30:39.773 回答
1

这不是我们想要的答案,但我猜 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/上为此问题提交了一个错误

于 2016-06-04T05:36:17.883 回答
1

我们实际上创建了NSProgress正确的,并为内存上传(putData)适当地更新它,但没有获得文件上传的文件大小(putFile),因为显然我没有发现文件属性/它们并不总是正确的。

我正在尽快修复,现在您可以使用NSFileManager.defaultManager().attributesOfItemAtPath(url.path!)[NSFileSize]!.longLongValue解决方法来获取文件大小:)

编辑(2016 年 10 月 10 日):这已解决,如果您使用最新版本的 Firebase 存储,您将不会遇到此问题 :)

于 2016-06-14T17:26:46.837 回答