2016-11-28 4 views
1

문제점을 파악하는 데 도움이되는 정보를 찾고 있습니다. 이미지를 서버에 게시/업로드하는 것과 관련된 모든 링크를 실제로 살펴 봤지만 내 코드 작업을 수행하는 것으로 보이는 것은 없습니다.매개 변수가있는 이미지 게시 - AFNetworking 3.1 및 목표 c (Xcode 8)

2 가지 옵션을 ... 다른 방법으로 게시했습니다 ... 주석 처리 된 코드는 ... 내 요청이 서버에 공백으로 표시됨을 나타냅니다.

다른 옵션 인 appendPartWithFormData, appendPartWithFileData를 사용해 보았습니다.

옵션 1

NSError * error; 2

NSError* error; 

    NSData *jsonInputData  = [NSJSONSerialization dataWithJSONObject:[requestParameter valueForKey:@"Param"] options:0 error:&error]; 
    NSString *jsonInputString = [[NSString alloc] initWithData:jsonInputData encoding:NSUTF8StringEncoding]; 
    NSDictionary* params = @{@"request": jsonInputString }; 

    AFURLSessionManager *manager1 = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 

    NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:[NSString stringWithFormat:@“XXXXXXX”] parameters:nil error:nil]; 


    req.timeoutInterval= [[[NSUserDefaults standardUserDefaults] valueForKey:@"timeoutInterval"] longValue]; 
    // [req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [req setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    // [req setHTTPBody:[jsonInputString dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSMutableData *body = [NSMutableData data]; 
    NSString *boundary = @"---------------------------14737809831466499882746641449"; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 

    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Disposition: form-data; name=\"profile_pic\"; filename=\"pic.png\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:self.imageData]; 
    [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [req addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

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

    // close form 
    [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [req setHTTPBody:body]; 

    [[manager1 dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 

     if (!error) { 
      NSLog(@"Reply JSON: %@", responseObject); 

      if ([responseObject isKindOfClass:[NSDictionary class]]) { 
       //blah blah 
      } 
     } else { 
      NSLog(@"Error: %@, %@, %@", error, response, responseObject); 
     } 
    }] resume]; 
+0

전화를 걸고 실제로 파일을 저장합니다. 결국 어떤 형태의 자격 인증을 사용합니다. – Alex

+0

고마워 알렉스 .. 서버가 Java로 구현되어 있고 Postmanplugin에서 동일한 요청을 게시 할 때 .. formdata에 첨부 된 png 파일과 함께 ... 요청이 잘 진행되고 성공적인 응답을받습니다. – Vijaya

답변

0

// Create paths to output images 
    NSString *pngPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.png"]; 
    UIImage *image = [UIImage imageWithData:self.imageData]; 
    [UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES]; 
    NSURL *imagePath = [NSURL fileURLWithPath:pngPath]; 

    NSData *jsonInputData  = [NSJSONSerialization dataWithJSONObject:[requestParameter valueForKey:@"Param"] options:0 error:&error]; 
    NSString *jsonInputString = [[NSString alloc] initWithData:jsonInputData encoding:NSUTF8StringEncoding]; 

    NSLog(@"converted JOSN Data %@",jsonInputString); 

    NSDictionary* params = @{@"request": jsonInputString }; 

    [manager POST:[requestParameter valueForKey:@"methodName"] parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
    { 
     //[formData appendPartWithFormData:self.imageData name:@"profilepic" ]; 

     //[formData appendPartWithFileData:self.imageData name:@"profilepic" fileName:@"profilepic.png" mimeType:@"image/png"]; 
     [formData appendPartWithFormData:jsonInputData name:@"request"]; 
     [formData appendPartWithFileURL:[NSURL fileURLWithPath:pngPath] 
            name:@"File" 
            error:nil]; 
    } progress:nil success:^(NSURLSessionDataTask *task, id responseObject) { 
     NSLog(@"Success: %@", responseObject); 
     [self requestSuccessed:responseObject]; 

    } failure:^(NSURLSessionDataTask *task, NSError *error) { 

     NSLog(@"Error: %@", error); 
     [self requestFailed:error]; 
    }]; 

옵션은 문제 이것은 일반적으로 나를 위해 작동

 // your parametes here 
    userInfoDict=[[NSMutableDictionary alloc] init]; 

    [userInfoDict setValue:@"image" forKey:@"iamge"]; 

    // if image is too large than the timeout intervel 
// [_request setTimeoutInterval:1000]; 

    _request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"api url" parameters:userInfoDict constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
       { 
       //convert imahe into data 
        NSData* data = UIImagePNGRepresentation(yourImage); 

        [formData appendPartWithFileData:data name:@"api paramets name in which you want to post image" fileName:@"myImage.png" mimeType:@"image/png"]; 

       } error:nil]; 

    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 

    _uploadTask = [manager 
        uploadTaskWithStreamedRequest:_request 
        progress:^(NSProgress * _Nonnull uploadProgress) 

        { 
         // This is not called back on the main queue. 
         // You are responsible for dispatching to the main queue for UI updates 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          //Update the progress view 
          [_playerProgress setProgress:uploadProgress.fractionCompleted]; 

          NSLog(@"\n uploading image vlaues %f\n",uploadProgress.fractionCompleted); 

          // for uploading video in background 
          manager.attemptsToRecreateUploadTasksForBackgroundSessions=YES; 

         }); 
        } 

        completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 
         if (error) { 
          NSLog(@"Error: %@", error); 

          // [_playerProgress setHidden:YES]; 

         } else 
         { 
          NSLog(@"%@ ", response); 

          // after upload comnlete disablle background uploading 

          manager.attemptsToRecreateUploadTasksForBackgroundSessions=NO; 

          NSLog(@"\n\n REsponse Form Server %@\n\n",responseObject); 
          //[responseObject valueForKey:@"error"]; 
                  //remove temp file 
          NSError *error; 

         } 
        } 

        ]; 

    [_uploadTask resume]; 
+0

감사합니다 Nouman ... 솔루션을 시도했지만 도움이되지 않았습니다 ... 요청이 비어 있습니다. – Vijaya

+0

@Vijaya이 코드는 나에게도 효과적입니다. 시간이 있다면 시도해보십시오. –

+0

다시 한번 감사드립니다. Nouman ... jpeg에서 png로 변경하면서, 이전에 시도 했었지만, 여전히 코드를 사용하여 코드를 작성했습니다. 나는 다른 것을 놓친 것 같습니다.하지만 운이 없습니다. – Vijaya

0

희망이 해결됩니다,이 일을보십시오. RESTful 스크립트가 올바른 파일 핸들을 선택했는지 확인해야한다. 나는 자바 모르겠지만, 같은 PHP에서 나는 그것을 할 것이다 : 당신이 듣고 서버 측 REST API를 어떤 형태 (PHP, 펄, Node.js를, 등)가 필요합니다 생각 $image = $_FILES["imagename"]["name"];

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    NSLog(@"Saving image file"); 

    [formData appendPartWithFileData:UIImagePNGRepresentation(image) name:@"imagename" fileName:@"image.png" mimeType:@"image/png"]; 

} error:nil]; 

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 
manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 

NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:^(NSProgress * _Nonnull uploadProgress) { 
    // This is not called back on the main queue. 
    // You are responsible for dispatching to the main queue for UI updates 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     NSLog(@"JSON uploadProgress.fractionCompleted: %f", uploadProgress.fractionCompleted); 
    }); 
} completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { 

    //NSLog(@"Error: %@", error); 
    NSLog(@"RESPONSE: %@ %@", response, responseObject); 
    if(error) { 
     NSLog(@"Error: %@", error); 

    } else { 
     NSString *responseString = [[[NSString alloc] initWithData:responseObject encoding:NSASCIIStringEncoding] mutableCopy]; 
     NSLog(@"RESPONSE: %@", responseString); 
    } 
}]; 
[uploadTask resume]; 
+0

감사합니다 알렉스 ...이 중 하나 나를 위해 작동하지 않았다 ... 나는 서버에서 많이 생각하지 않아,하지만 안드로이드 애플 리케이션에서 바이트 배열 이미지와 서버에 보내집니다 그것을 잘 선택합니다. .. – Vijaya