2012-05-10 2 views
1

스트리밍 모드에서 http로 선형 파일을 업로드하려고합니다. 아이디어는이 단계를 동시에 수행합니다. 1) 스레드 1 : 오디오 파일을 녹음하고 임시 파일에 저장합니다. 2) 스레드 2 : 임시 파일에서 n 바이트를 가져 와서 http 서버로 보냅니다.오디오 업로드 - http 스트리밍

http 스트림을 작성하는 방법은 무엇입니까? CFHTTPStream에서 쓰기 메소드를 볼 수 없었습니다. 읽기 전용 : 소켓을 사용해야합니까? 감사합니다 !!! (NSStreamStatus) streamStatus을 -

내 실제 코드는이 솔루션은 NSInputStream의 서브 클래스를 생성하고, 방법, 개폐 구현, 읽기, 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]; 
관련 문제