3

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];
4

1 に答える 1

2

のプロパティ値を試しましたNSStreamFileCurrentOffsetKeyか?

CF-APIも一見の価値があります。

-[NSOutputStream write:maxLength:]必要に応じて、現在の位置を追跡するためにサブクラス化できます。

于 2012-01-30T18:39:40.850 に答える