1

UIImagePickerController와 함께 UIImage 테이크를 다른 관련 값과 함께 서버 POST에 보내려고합니다. 이미지가 유효한 JSON 값이 아니기 때문에,UIImagePickerController에서 UIImage POST를 서버로 보내시겠습니까?

-(void)sendImageToServer:(UIImage *)image 
{ 
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
    queue.maxConcurrentOperationCount = 4; 

    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration ephemeralSessionConfiguration] delegate:nil delegateQueue:queue]; 
    NSURL *uploadURL = [NSURL URLWithString:@"http://...."]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:uploadURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30.0]; 

    [request addValue:@"application/json" forHTTPHeaderField:@"Accept"]; 

    [request setHTTPMethod:@"POST"]; 

    NSData *postData = [[NSData alloc] init]; 
    [postData setValue:UIImageJPEGRepresentation(image, 1.0) forKey:@"image"]; 
    [postData setValue:@"1" forKey:@"categories[0]"]; 
    [postData setValue:@"4" forKey:@"categories[1]"]; 

    NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request 
                   fromData:postData 
                 completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

     if (!error) { 
      NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 
      if (httpResponse.statusCode == 200) { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        NSError *err; 
        NSDictionary *JSONDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&err]; 
        NSLog(@"HTTP 200 response: %@", JSONDict); 
       }); 
      } else {  
       NSLog(@"HTTP %ld status!", (long)httpResponse.statusCode); 
      } 
     } else { 
      NSLog(@"HTTP post image error: %@", error); 
     } 
    }]; 
    [uploadTask resume]; 
} 

JSON 직렬화가 여기에 작동하지 않습니다하지만 UIImageJPEGRepresentation (이미지, 1.0)에 사전 값 @ "이미지"를 설정하려고 줄을 얻을. 다른 한편으로는 나는 시도한다 :

... 
NSMutableData *postData = [[NSMutableData alloc] init]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:postData]; 

    [archiver encodeObject:UIImageJPEGRepresentation(image, 1.0) forKey:@"image"]; 
    [archiver encodeObject:@"1" forKey:@"categories[0]"]; 
    [archiver encodeObject:@"4" forKey:@"categories[1]"]; 
    [archiver finishEncoding]; 



    //NSData *postData = [NSJSONSerialization dataWithJSONObject:dataDict options:NSJSONWritingPrettyPrinted error:&jsonError]; 
    //Now you can post the json data 

    NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request 
                   fromData:postData 
                 completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {... 

보관 된 키 : 값 쌍은 서버에 그런 것처럼 보이지 않는다. 이것은 일상적으로 iOS 코딩 작업이어야합니다. 서버는 전혀 키를하지 않습니다

NSError *jsonError; 
    NSData *postData = [NSJSONSerialization dataWithJSONObject:@{@"image":@"123",@"categories[0]":@"1",@"categories[1]":@"4"} options:NSJSONWritingPrettyPrinted error:&jsonError]; 

... NSData의 적절한 사용이 아니다

+0

NSData * imageData = UIImageJPEGRepresentation (image, 1.0); –

+0

당신은 더 나은 ASIHTTPREQUEST 또는 AFNETWORKING 라이브러리를 사용해보십시오. –

답변

0

: 심지어 난 그냥하려고하면

. NSData에는 키 이름이 지정된 이미지 (또는 그 이후의 다른 두 이미지)가 없기 때문에 지금 당장 충돌합니다. 당신이해야 할 일은 NSDictionary을 생성 한 다음 이것을 NSData으로 변환하는 것입니다.

이 대신 같은 것을 수행

NSDictionary *dictionary = [NSDictionary alloc]initWithObjectsAndKeys:image,@"image",@(1),@"categories[0]",@(4),@"categories[1]", nil]; 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dictionary]; //Not currently using NSJSONSerialization since you want to post a Dictionary with an invalid NSJSONSerialization type in it. 
//Now you can post the json data 
+0

감사합니다. @tdevoy. 나는 이미 비슷한 것을 시도했지만, 같은 위치에 예외와 예외가 발생했다 : \t \t \t \t \t [NSJSONSerialization datataWithJSONObject ....];NSDictionary * dataDict = @ {@ "이미지": UIImageJPEGRepresentation (image, 1.0), @ "categories [0]": @ "1", @ "categories [1] JPEG 표현은 유효한 JSON 값이 아닌 것으로 가정합니다. ": @"4 "}}; NSError * jsonError = nil; NSData * postData = [NSJSONSerialization dataWithJSONObject : dataDict 옵션 : NSJSONWritingPrettyPrinted 오류 : & jsonError]; – izk

+0

네, whoops는 NSString, NSNull, NSNumber, NSArray 및 NSDictionary 객체에서만 NSJSONSerialization 메서드가 작동한다는 것을 잊었습니다. 대신 NSKeyedArchiver를 사용하여 NSData로 변환 할 수 있습니다. –

0

이 AFNetworking로 사용 해보세요를, 그것은 업로드를 할 수있는 좋은 방법이 여기에 샘플을 찾을 수 있습니다 https://github.com/AFNetworking/AFNetworking#creating-an-upload-task

나는 개인적으로 사용하는 모든 사람을 추천합니다 그것은 내가 웹 서버와 내 애플 리케이션을 통신하는 데 아무 문제가 없었 사용하기 시작했기 때문에.

0

AFNetworking과 멀티 파트 양식 게시물을 사용하십시오. 여기에 대략적인 예가 나와 있습니다 (구현이 달라 지므로 블록을 전달 중입니다).

AFHTTPRequestOperation *operation = [self POST:FullURLString parameters:Params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
     [formData appendPartWithFileData:fileData name:fileName fileName:fileName mimeType:mimeType]; 
    } success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSData *responseData = [operation responseData]; 
     id retObj; 
     NSError *error = nil; 
     if (responseData) { 
      retObj = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error]; 
     } 
     // Pass back the serialized object (either an NSArray of type NSDictionaries or an NSArray of type customClass) 
     block(retObj); 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Failed with error = [Error]: %@", error); 
     block(nil); 
}]; 
관련 문제