2012-06-02 9 views
1

iOS 응용 프로그램을 개발 중입니다. 우리 서버에 프로그래밍 방식으로 오디오 파일을 보내야합니다. 서버에 샘플 wav 오디오 파일을 보내려면 다음 코드를 사용하고 있습니다. Google 서버는 수신을 위해 부호있는 바이트 배열 형식의 오디오 파일 만 허용합니다.iPhone : 오디오 wav 바이트 데이터를 서버에 업로드하는 중 오류가 발생했습니다.

NSURL *urlPath = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"Crash" ofType:@"wav"]]; 
NSString *wavbundlepath = [urlPath absoluteString]; 
NSLog(@"wavbundlepath: %@",wavbundlepath); 
NSData *bytes = [wavbundlepath dataUsingEncoding:NSUTF8StringEncoding]; 
NSLog(@"bytes: %@",bytes); 

NSString *recordPostLength = [NSString stringWithFormat:@"%d", [bytes length]]; 

NSMutableString *urlstr = [NSMutableString stringWithFormat:@"%@", @"http://www.mywebserver/api/UploadFile?Name="]; 
[urlstr appendString:@"crash"]; 
[urlstr appendFormat:@"&MemberID=%d", 0]; 
[urlstr appendFormat:@"&Type=%@",@"Recording"]; 
[urlstr appendFormat:@"&client=%@",@"ios"]; 
NSLog(@"urlstr.......%@",urlstr); 

NSMutableURLRequest *recordRequest = [[NSMutableURLRequest alloc] init] ; 
[recordRequest setURL:[NSURL URLWithString:urlstr]]; 
[recordRequest setHTTPMethod:@"POST"]; 
[recordRequest setValue:recordPostLength forHTTPHeaderField:@"Content-Length"]; 
[recordRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[recordRequest setHTTPBody:bytes]; 

NSURLResponse *recordResponse; 
NSError *recordError; 
NSData *recordResponseData = [NSURLConnection sendSynchronousRequest:recordRequest returningResponse:&recordResponse error:&recordError]; 
NSString *recordResp = [[NSString alloc]initWithData:recordResponseData encoding:NSUTF8StringEncoding]; 

NSLog(@"recordResp:%@", recordResp); 

하지만 문제는 항상 "입력 문자열이 올바르지 않습니다."입니다. 응답 오류.

오디오 바이트를 서버에 업로드하는 것에 대해별로 알고 있지 않습니다. 누군가이 코드를 확인하고 이것이 유효한 코드인지 또는 서버에 wav 오디오 바이트 배열을 업로드하지 않았는지 말해 줄 수 있습니까?

감사합니다.


내 서버 측 엔지니어가 다른 일이 몸을 게시해야하지 말했듯이 내가 코드를 아래에 시도

업데이트 된 코드, 그리고 그것을 잘 긍정적 인 반응을 얻고 작동합니다. 그러나 서버 측에서는 NSData 바이트 (32 비트 요소) 형식으로 작업 할 수 없기 때문에 서버 측에서는 바이트 배열 또는 부호있는 바이트 데이터 형식 만 수신하도록 구현했기 때문에 보내지 않습니다.

NSURL *urlPath = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"Temp" ofType:@"wav"]]; 

NSString *wavbundlepath = [urlPath absoluteString]; 
NSLog(@"wavbundlepath: %@",wavbundlepath); 

NSData *bytes=[NSData dataWithContentsOfURL:urlPath]; 
NSLog(@"bytes: %@",bytes); 

NSString *recordPostLength = [NSString stringWithFormat:@"%d", [bytes length]]; 

NSMutableString *urlstr = [NSMutableString stringWithFormat:@"%@", @"http://www.myserver.com/api/UploadFile?Name="]; 
[urlstr appendString:@"Temp"]; 
[urlstr appendFormat:@"&MemberID=%d", 0]; 
[urlstr appendFormat:@"&Type=%@",@"Recording"]; 
[urlstr appendFormat:@"&client=%@",@"ios"]; 
NSLog(@"urlstr.......%@",urlstr); 

NSMutableURLRequest *recordRequest = [[NSMutableURLRequest alloc] init] ; 
[recordRequest setURL:[NSURL URLWithString:urlstr]]; 

NSInputStream *dataStream = [NSInputStream inputStreamWithData:bytes]; 
[recordRequest setHTTPBodyStream:dataStream]; 

[recordRequest setHTTPMethod:@"POST"]; 

NSURLResponse *recordResponse; 
NSError *recordError; 
NSData *recordResponseData = [NSURLConnection sendSynchronousRequest:recordRequest returningResponse:&recordResponse error:&recordError]; 

NSString *recordResp = [[NSString alloc]initWithData:recordResponseData encoding:NSUTF8StringEncoding]; 
NSLog(@"recordResp:%@", recordResp); 
recordResponceJson = [recordResp JSONValue]; 
NSLog(@"recordResponceJson = %@",recordResponceJson); 
recId = [recordResponceJson valueForKey:@"ID"]; 
NSLog(@"recId....%@", recId); 

누군가가 나를 인도 시겠어요, 내가 어떻게이 HTTP 포스트 바이트의 배열을 보낼 수 있습니까?

답변

0

은 몇 가지 문제가 있습니다 먼저 유효한 WAV 파일을 반환하지 않습니다 파일을 읽는 방법 :

당신은 [을 NSData dataWithContentsOfURL을 :]를 사용한다 바이트를 읽을 수 있습니다. 읽는 방식에 따라 바이트를 문자로 변환하려고합니다. 이렇게하면 wav 파일이 손상됩니다.

둘째, POST 본문의 내용 유형이 잘못되었을 수 있습니다.

[recordRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

오디오 바이트는 x-www-form-urlencoded 형식으로 인코딩되지 않습니다. 서버가 오디오/wav 또는 응용 프로그램/옥텟 스트림 콘텐츠 유형을 허용 할 가능성이 큽니다. 서버 개발자가 서버에서 기대하는 바를 정확하게 확인하십시오.

또한 NSMutableURLRequest 메서드 인 setHTTPBodyStream :을 통해 메모리로 전체 내용을로드하지 않고도 파일을 보낼 수 있습니다.

+0

감사합니다. 질문이 하나 더 있습니다. NSData는 부호없는 바이트 배열입니까? – Stella

+0

예, NSData는 바이트 모음입니다. 따라서 POST 본문으로 추가하면 바이트 스트림으로 요청에 추가됩니다. 시체를 메모리로로드하는 대신 setHTTPBodyStream : 메서드를 사용하여 스트림으로 보내는 것이 좋습니다. 스트림 메소드는 HTTP 요청의 content-length 헤더를 자동으로 채울 것이므로 계산할 필요가 없습니다. –

+0

안녕하세요, 저는 서버 측 엔지니어에게 물었습니다. 포스트 바디는 파일 만 포함해야한다고 말했습니다. 그래서, 나는 다른 것들을 제거하고 setHttpBodyStream()을 사용해 보았습니다. 위의 업데이트 코드를 확인하십시오. 하지만 아무 것도하지 않습니다. 빈 응답이 수신되었습니다. – Stella

관련 문제