2014-09-13 3 views
0

서버에 POST 요청을 통해 avaudiorecorder를 보내려고합니다. 하지만 해결할 수없는 몇 가지 이유로 업로드하지 않습니다. 먼저 내가 보내려는 파일의 경로를 가져 와서 필요한 모든 헤더가있는 Post 요청 메소드를 만듭니다. 서버 응답은 파일 업로드가 없으므로 파일의 경로에 문제가있는 것 같지만 해결책을 얻지는 못합니다. 권한 부여 내용과 함께 POST 요청, 다중 파트 양식 데이터 및 경계가있는 content-type 및 "uri_file"및 파일로 업로드되는 파일을 보내야합니다. {uri_file : 파일} 나는 그것을 보내려고하지만, 서버가 응답 - NotEnoughData는 = "당신은 파일을 제공해야"-AVaudioRecorder 게시 요청 iOS가 전송되지 않았습니다.

........... 

-(NSData *)sendTrack{ 

NSMutableDictionary *dictrvo = [NSMutableDictionary dictionaryWithObjectsAndKeys: audioRecorder.url,@"uri_file", nil ]; 
NSUserDefaults *prefs= [NSUserDefaults standardUserDefaults]; 


// get the audio data from main bundle directly into NSData object 
NSURL *filePath = [prefs objectForKey:@"Revo1"]; 
if (filePath == nil) { 
    NSLog(@"vacio1"); 
} 
NSData *result =[NSKeyedArchiver archivedDataWithRootObject:dictrvo]; 
NSData *archivo = [[NSData alloc] initWithContentsOfFile:filePath]; 
if (result == nil) { 
    NSLog(@"vacio"); 
} 

NSData *response= [self createTrackPostRequest:archivo]; 
NSDictionary *dictionaryResponse = [self getDataFromJson:response]; 

return nil; 

} 

// POST 요청 방법

-(NSData *)createTrackPostRequest:(NSData *)requestData{ 

NSString *strData = [[NSString alloc]initWithData:requestData encoding:NSUTF8StringEncoding]; 
// Print out new string 
NSLog(@"DATA: %@",strData); 
//URL 
NSURL *URL = kRevoTrack; 
if(URL == nil) 
    NSLog(@"estoy vacio"); 

//REQUEST 
NSString *username; 
NSString *api_key; 
NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:URL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60]; 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
username = [prefs objectForKey:@"userName"]; 
api_key = [prefs objectForKey:@"api_key"]; 
NSString * authorizationcontent = [@"ApiKey " stringByAppendingString:[username stringByAppendingString:[@":" stringByAppendingString:api_key]]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:authorizationcontent forHTTPHeaderField:@"Authorization"]; 
[request setValue:@"multipart/form-data ; boundary = ---------1239821390213hdjfhsakdasjl123ad" forHTTPHeaderField:@"Content-Type"]; 
[request setValue:@"form-data; name =\"uri_file\"; file =\"MyAudioMemo.m4a\"\r\n" forHTTPHeaderField:@"Content-Disposition"]; 
dataUsingEncoding:NSUTF8StringEncoding]]; 

[request setValue: [NSString stringWithFormat: @"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"]; 
[request setHTTPBody:requestData]; 

NSURLResponse *response = nil; 
NSError *error = nil; 

NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

if(error == nil){ 

    // REQUEST SENT WITHOUT ERROR 
    return result; 

}else{ 

    //ERROR SENDING THE REQUEST 

    NSLog(@"ERROR"); 
} 
return nil; 
} 

아무도 나를 도울 수 있습니까? 고마워요!

답변

0

요청을 약간 다르게 포맷하면됩니다. 다중 요청을 만들 때 먼저 HTML로 양식을 작성하는 것이 좋습니다. 그런 다음 Firebug가 활성화 된 Firefox에서 샘플 HTML을 게시합니다. 그러면 게시물 데이터를 분석하고 요청 본문이 일치하는지 확인할 수 있습니다.

-----------------------------173920846362415155847887193 
Content-Disposition: form-data; name="uri_file"; filename="MyAudioMemo.m4a" 
Content-Type: audio/x-m4a 
<bunch of data> 
-----------------------------173920846362415155847887193-- 

다음은 수정 된 요청 방법입니다.

- (NSData *)createTrackPostRequest:(NSData *)requestData 
{ 
    // Prepare authorization 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *username = [defaults objectForKey:@"userName"]; 
    NSString *api_key = [defaults objectForKey:@"api_key"]; 
    NSString *authorizationcontent = [@"ApiKey " stringByAppendingString:[username stringByAppendingString:[@":" stringByAppendingString:api_key]]]; 

    // Create the request 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:kRevoTrack]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:authorizationcontent forHTTPHeaderField:@"Authorization"]; 
    [request setValue:[NSString stringWithFormat: @"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"]; 
    [request addValue:@"multipart/form-data; boundary=---------------------------725025452680558686651931680" forHTTPHeaderField:@"Content-Type"]; 

    // Create the body 
    NSMutableData *body = [NSMutableData data]; 
    [body appendData:[@"\r\n-----------------------------725025452680558686651931680\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Disposition: form-data; name=\"uri_file\"; filename=\"MyAudioMemo.m4a\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Type: audio/x-m4a\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:requestData]; 
    [body appendData:[@"\r\n-----------------------------725025452680558686651931680--" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [request setHTTPBody:body]; 

    // Send the request 
    NSURLResponse *response = nil; 
    NSError *error = nil; 
    NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

    // Return the result 
    if (error == nil) { 
     NSLog(@"result: %@", [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding]); 
     return result; // REQUEST SENT WITHOUT ERROR 
    } else { 
     NSLog(@"ERROR"); // ERROR SENDING THE REQUEST 
    } 
    return nil; 
} 
+0

도움을 주셔서 감사합니다. 그것은 나를 미치게했다! 필요한 것을보기 위해 먼저 HTML에 게시하는 것은 나에게 발생하지 않았습니다. – Adrideh