2012-05-10 11 views
1

httpの下でリニアファイルをストリーミングモードでアップロードしようとしています。 考えてみましょう。 1)スレッド1:オーディオファイルを録音してテンポラリファイルに保存します 2)スレッド2:テンポラリファイルからnバイトを取り出し、httpサーバに送信します。音声をアップロードする - httpストリーミング

httpストリームはどのように書くことができますか?CFHTTPStreamでは書き込みメソッドが表示されませんでした。読み込みのみ: 使用ソケットが必要ですか? ありがとうございます! (NSStreamStatus)streamStatus -

私の実際のコードは、ソリューションがNSInputStreamのサブクラスを作成し、openメソッドを実装し、近く、読み、hasBytesAvailableと忘れていないです

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); 

答えて

3

です。 最後のメソッドが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]; 
です。
関連する問題