NSStream,正在获取读取的字节百分比



我正在将一个文件上传到服务器,使用NSStream API进行块读取。我正在尝试显示一个进度条,显示上传进度。我找不到一个可靠的解决方案来确定读取到文件中的字节数。在更改文件和块大小时,我仍然会得到总字节数,或者一些奇怪的数据,比如93或212的字节数。有人有什么技巧可以做到这一点吗?看起来应该很简单。

  // create the write stream
    NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:uploadTempFilename append:NO];
    [outputStream open];
    const char *UTF8String;
    size_t writeLength;
    UTF8String = [multipartBegin UTF8String];
    writeLength = strlen(UTF8String);
    size_t __unused actualWrittenLength;
    actualWrittenLength = [outputStream write:(uint8_t *)UTF8String maxLength:writeLength];
    NSLog(@"actualWrittenLength1 %d bytes)", actualWrittenLength);//this will be 908
    // open the input stream
    const size_t bufferSize = 128 ;
    size_t readSize = 0;
    uint8_t *buffer = (uint8_t *)calloc(1, bufferSize);
    [inImageStream open];
    while ([inImageStream hasBytesAvailable]) {
        if (!(readSize = [inImageStream read:buffer maxLength:bufferSize])) {
            break;
        }

     size_t __unused actualWrittenLength;

        actualWrittenLength = [outputStream write:buffer maxLength:readSize];
        NSLog(@"actualWrittenLength2 %d bytes)", actualWrittenLength);//this always outputs 128, until the last call which will be something like 22

    }
    //NSLog(@"NSStreamFileCurrentOffsetKey %d", [outputStream valueForKey:NSStreamFileCurrentOffsetKey]);
    [inImageStream close];
    free(buffer);

    UTF8String = [multipartEnd UTF8String];
    writeLength = strlen(UTF8String);
    actualWrittenLength = [outputStream write:(uint8_t *)UTF8String maxLength:writeLength];
    NSLog(@"actualWrittenLength3 %d bytes)", actualWrittenLength);//this will always be 42
[outputStream close];

    NSInputStream *inputStream = [NSInputStream inputStreamWithFileAtPath:uploadTempFilename];
    [HTTPRequest setContentType:contentType];
    return [HTTPRequest performMethod:@"POST" onURL:url withInputStream:inputStream knownContentSize:fileSize];

您尝试过NSStreamFileCurrentOffsetKey的属性值吗?

CF API可能也值得一看。

如果需要,您可以将-[NSOutputStream write:maxLength:]子类化以跟踪当前位置。

最新更新