2014-10-09 3 views
1

웹 서버에 사용자의 데이터를 업로드하는 앱이 있습니다.PHP를 사용하여 ios의 JSON을 통해 웹 서버에 이미지 업로드

아래 코드를 사용하여 아래 코드로 웹 서버에 데이터를 전달합니다.

-(IBAction)btnRegister:(id)sender 
{ 
    jsonSP = [SBJSON new]; 
    jsonSP.humanReadable = YES; 

    NSString *service = @"/register.php"; 
    NSData *imageData = UIImagePNGRepresentation([UIImage imageNamed:@"register_btn.png"]); 
    [Base64 initialize]; 
    NSString *imageString = [Base64 encode:imageData]; 
    NSLog(@"%@",imageString); 


    NSString *requestString = [NSString stringWithFormat:@"{\"?username\"=\"%@\"&\"user_password\"=\"%@\"&\"first_name\"=\"%@\"&\"email\"=\"%@\"&\"profile_photo_link\"=\"%@\"\"}",@"Test",@"Test",@"Test",@"[email protected]",imageString]; 
    NSData *requestData = [NSData dataWithBytes: [requestString UTF8String] length: [requestString length]]; 

    NSString *fileLoc = [[NSBundle mainBundle] pathForResource:@"URLName" ofType:@"plist"]; 
    NSDictionary *fileContents = [[NSDictionary alloc] initWithContentsOfFile:fileLoc]; 
    NSString *urlLoc = [fileContents objectForKey:@"URL"]; 
    urlLoc = [urlLoc stringByAppendingString:service]; 
    NSLog(@"URL : %@",urlLoc); 
    // urlLoc = [urlLoc stringByAppendingString:@"?username=abcd&password=abcd"]; 
    urlLoc = [urlLoc stringByAppendingString:requestString]; 
    urlLoc = [urlLoc stringByReplacingOccurrencesOfString:@"{" withString:@""]; 
    urlLoc = [urlLoc stringByReplacingOccurrencesOfString:@"}" withString:@""]; 
    urlLoc = [urlLoc stringByReplacingOccurrencesOfString:@"\"" withString:@""]; 
    NSLog(@"URL : %@",urlLoc); 
    // [fileContents release]; //o_r 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: urlLoc]]; 
    NSString *postLength = [NSString stringWithFormat:@"%d", [requestData length]]; 
    [request setHTTPMethod: @"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody: requestData]; 

    // self.connection = [NSURLConnection connectionWithRequest:request delegate:self]; 

    NSError *respError = nil; 
    NSData *returnData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: &respError ]; 
    NSLog(@"response is %@",returnData); 


    // [request release]; 
    if (respError) 
    { 
     //[customSpinner hide:YES]; 

     UIAlertView *alt=[[UIAlertView alloc]initWithTitle:@"Internet connection is not Available!" message:@"Check your network connectivity" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
     [alt show]; 
     //[alt release]; 


    } 
    else 
    { 
     NSString *responseString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding]; 
     NSLog(@"response string %@",responseString); 
    } 
} 

웹 서버에 이미지없이 성공적으로 데이터를 보낼 수 있습니다.

그러나 Base64 인코딩으로 위에 표시된 코드로 이미지를 업로드하면 데이터가 웹 서버에 업로드되지 않습니다. NSLog에서 요청 쿼리 문자열이 너무 길다는 오류가 발생합니다.

이미 Base64.h 및 .m 파일을 가져 왔습니다.

이미지와 함께 데이터를 전달하고 싶습니다.

어떻게하면됩니까?

나는 많은 링크가 있음을 알고 있지만이 방법으로 전달하고 싶습니다. 그래서 내가 뭘 잘못하고 있는지 말해 주시겠습니까?

도와주세요.

미리 감사드립니다.

답변

0

멀티 파트 양식 데이터로 다음 코드로 작업했습니다.

responseData = [NSMutableData data]; 
    NSString *service = @"http:///registerUser.php"; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:service]]; 
    [request setHTTPMethod:@"POST"]; 

// boundry 만들기 ...

NSString *boundary = @"---------------------------14737809831466499882746641449"; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

// 게시물의 몸을 만들기

NSMutableData *body = [NSMutableData data]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Disposition: form-data; name=\"profile_photo_link\"; filename=\"ipodfile.png\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

UIImageView *imgvUserImage = [[UIImageView alloc]init]; 
    imgvUserImage.image= [UIImage imageNamed:@"register_btn.png"]; 

    NSData * imageData=[NSData dataWithData:UIImagePNGRepresentation(imgvUserImage.image)]; 

    [body appendData:[NSData dataWithData:imageData]]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 


[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"username\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 

    [body appendData:[[NSString stringWithFormat:@"%@",txtUserName.text] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

// reqeust로 게시물의 몸을 설정

[request setHTTPBody:body]; 
    postconnection=[[NSURLConnection alloc] initWithRequest:request delegate:self]; 

** 응답 용

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [responseData setLength:0]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [responseData appendData:data]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    [self removeProgressIndicator]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    if (connection == postconnection) 
    { 
     NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
     NSLog(@"%@",responseString); 
     // NSDictionary *deserializedData = [responseString objectFromJSONString]; 
     // NSString *string = [deserializedData objectForKey:@"Status"]; 


    } 
} 
0

헤이 Manthan는 NSString로 변환 UIImage이 울부 짖는 소리 코드를 시도하고 서버

 UIImage *imgPic =[UIImage imageNamed:@"register_btn.png"]; 
     NSData * imageData = UIImagePNGRepresentation(imgPic); 
     NSString *base64String = [imageData base64EncodedStringWithOptions:0]; 
+0

고마워. 나는 그것을 확인하고 알게 될 것이다. – Manthan

+0

NSLog에서 너무 긴 base64String을 얻었 기 때문에 요청 문자열의 오류 메시지가 여전히 너무 길다. – Manthan

+0

다중 경로 데이터를 통해 이미지를 보내는 방법을 알고 있습니까? 그렇다면 도움을주십시오. 카이 네 바카이를 도우려는 자유로운 안녕. – Manthan

0

의 서버 문제에 전달, 그 그 오류를 말하고.

json에는 최대 길이가 없지만 전송할 수있는 최대 데이터가 있습니다. 당신이 php.ini 파일에 액세스 할 수 있으면 post_max_size

에서 변경할 수

또한 php_value post_max_size 20M

편집 :이 수정을 위해, 당신은 htaccess로 파일을 전송할 수있는 데이터의 양을 설정

+0

@o Pi : 내 코드가 맞지만 웹 서버 측에서 변경해야합니다. 승인? – Manthan

+0

@Manthan의 코드가 아니며 서버의 설정은 –

+0

입니다. 위의 코드에서 서버 측 코드 만 변경할 필요는 없습니다. – Manthan

0

이렇게 해보십시오.

- (void)addNewItem:(SH_NewItem *)newItem withCompletitionBlock:(void(^)(NSArray *items, NSError *error, NSDictionary *userInfo))completitionBlock 
{ 
    AFHTTPClient *client = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:[[SH_Shared sharedInstance] getBaseURL]]]; 

    //main cover image... 
    NSData *imageData = UIImageJPEGRepresentation(newItem.image, JPEG_IMAGE_QUALITY); 


    NSData *imageData1 = UIImageJPEGRepresentation(newItem.image1, JPEG_IMAGE_QUALITY); 
    NSData *imageData2 = UIImageJPEGRepresentation(newItem.image2, JPEG_IMAGE_QUALITY); 
    NSData *imageData3 = UIImageJPEGRepresentation(newItem.image3, JPEG_IMAGE_QUALITY); 
    NSData *imageData4 = UIImageJPEGRepresentation(newItem.image4, JPEG_IMAGE_QUALITY); 

    NSDictionary *params = [[NSDictionary alloc]init]; 

    params = [NSDictionary dictionaryWithObjectsAndKeys: 
          newItem.title, @"title", 
          newItem.itemDescription, @"description", 
          [[SH_Shared sharedInstance] token], @"token", 
          nil]; 

    NSLog(@"params-%@",params); 

    NSMutableURLRequest *request = [client multipartFormRequestWithMethod:@"POST" path:@"new_item" parameters:params constructingBodyWithBlock: ^(id <AFMultipartFormData> formData) { 
     if (imageData != nil) 
      [formData appendPartWithFileData:imageData name:@"images[0]" fileName:@"image_ad.png" mimeType:@"multipart/form-data"]; 


     if (imageData1 != nil) 
      [formData appendPartWithFileData:imageData1 name:@"images[1]" fileName:@"image_ad1.png" mimeType:@"multipart/form-data"]; 
     if (imageData2 != nil) 
      [formData appendPartWithFileData:imageData2 name:@"images[2]" fileName:@"image_ad2.png" mimeType:@"multipart/form-data"]; 
     if (imageData3 != nil) 
      [formData appendPartWithFileData:imageData3 name:@"images[3]" fileName:@"image_ad3.png" mimeType:@"multipart/form-data"]; 
     if (imageData4 != nil) 
      [formData appendPartWithFileData:imageData4 name:@"images[4]" fileName:@"image_ad4.png" mimeType:@"multipart/form-data"]; 

    }]; 


    AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

    [self getDataWithOperation:op completitionBlock:^(NSData *data, NSError *error, NSDictionary *userInfo) { 
     CJSONDeserializer *deserializer = [CJSONDeserializer deserializer]; 

     NSError *deserializeError = nil; 

     NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

     NSLog(@"Response: %@", str); 


    NSDictionary *requestResponseDict = [deserializer deserialize:data error:&deserializeError]; 

     NSString *status = [requestResponseDict valueForKey:kStatus]; 

     BOOL isSuccess = [[status valueForKey:kSuccess] boolValue]; 

     if (isSuccess) 
     { 
      // it's OK 

     } 
     else 
     { 
      // its error 
     } 
    }]; 
} 
관련 문제