1

ストリーミングモードでhttpの下に線形ファイルをアップロードしようとしています。アイデアは、この手順を同時に実行することです。1)スレッド1:オーディオファイルを録音して一時ファイルに保存します。2)スレッド2:一時ファイルからnバイトを取得し、httpサーバーに送信します。

httpストリームを書き込むにはどうすればよいですか?、CFHTTPStreamでは、書き込みメソッドが表示されず、読み取りのみが行われました:sソケットを使用する必要がありますか?ありがとう!!!

私の実際のコードは

   CFWriteStreamRef stream;
   NSString *strUrl = @"myurl";       
   NSURL *url = [[[NSURL alloc] initWithString:strUrl] retain];

   CFStringRef requestMethod = CFSTR("GET");

   CFHTTPMessageRef message= CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, (CFURLRef)url, kCFHTTPVersion1_1);

    CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Content-Type"),
                                     CFSTR("multipart/form-data"));
   stream =  ??  //CFReadStreamCreateForHTTPRequest(NULL, message);
    CFRelease(message);
  //other headers...        
    if (CFWriteStreamSetProperty(stream, kCFStreamPropertyHTTPShouldAutoredirect, kCFBooleanTrue)  == false)
    {
        NSLog(@"Error");
        return NO;
    }


    //
    // Open the stream
    //
    if (!CFWriteStreamOpen(stream))
    {
        CFRelease(stream);
        NSLog(@"Error");
        return NO;
    }

    CFStreamClientContext context = {0, self, NULL, NULL, NULL};
    CFWriteStreamSetClient(stram, kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
                           RSWriteStreamCallBack,
                           &context);
    CFWriteStreamScheduleWithRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
4

1 に答える 1

3

解決策は、NSInputStreamのサブクラスを作成し、メソッドopen、close、read、hasBytesAvailableを実装し、忘れないでください-(NSStreamStatus)streamStatus。最後のメソッドはhttpから呼び出され、開いているか、閉じているか、送信が終了したか(NSStreamStatusAtEnd)を確認します(他のステータスもありますが、これが最も重要です)。大量のデータを送信する必要があるため、バッファのようなtmpファイルを使用しますが、おそらくデータメモリバッファの方が優れている可能性があります。最後に、カスタムNSInputStreamを使用する他のクラスを実装します。コードは次のとおりです。

    NSURL *url = [NSURL URLWithString:@"url"];
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
    [req setHTTPMethod:@"POST"];
    //set headers if you have to do for example: 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data"];
    [req setValue:contentType forHTTPHeaderField:@"Content-Type"];
    //Create your own InputStream
    instream = [[CustomStream alloc] init];
    [req setHTTPBodyStream:instream];
    //I remove instream later 
      NSURLConnection *aConnection = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:NO];
    [aConnection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [aConnection start]; 
于 2012-05-21T21:19:00.490 に答える