2012-07-11 5 views
6

메시징 앱을 개발 중이며 사용자는 사진을 서로 보낼 수도 있습니다. 사용자가 AFNetworking로 이동하기 전에AFNetworking으로 둘 이상의 이미지 보내기

내가 병렬로 보내 이상의 사진 (나는 두 번째를 보내기 전에 내가 업로드를 완료하는 최초의 하나 기다리지 않는다) 보낼 때
나는 ASIFormDataRequest으로이 일에 성공 , 실제로 2 장의 이미지를 보내면 두 이미지가 동시에 전송되어 다른 사용자에게 성공적으로 전달됩니다.

AFNetworking으로이 작업을 시도 할 때 이상한 동작이 발생합니다.
나는 USER1도 사용자 2 개의 이미지를 전송 한 경우를 설명하려고합니다 : 사용자 1 image1에를 보내

  1. - 모든 것이 좋아 보인다>, 내가 업로드 진행 상황을 볼 수 있습니다.
  2. User1 다음으로 image2 보내기 -> 여전히 괜찮아 보입니다. 두 이미지 업로드 진행 상태를 볼 수 있습니다.
  3. image1 업로드가 완료되었습니다. -> user2가 image1과 image2의 조합처럼 보이는 손상된 이미지를 가져옵니다!
  4. 이미지 2 업로드가 완료 - 사용자 2는

성공적으로 이미지 2를 얻을 수> 이것은 내가 이미지를 전송하는 방법입니다

- (void)sendImageMsgWithPath:(NSString *)path 
         image:(UIImage *)image 
        success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure 
        progress:(void (^)(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))progress 
{ 
    NSData *imageData = UIImageJPEGRepresentation(image, 0.5); 

    // create the request 

    NSURLRequest *request = [[AppClient sharedClient] multipartFormRequestWithMethod:@"POST" path:path parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
          { 
           [formData appendPartWithFileData:imageData name:@"image_name" fileName:@"image_name.jpg" mimeType:@"image/jpeg"]; 
          }]; 


    // create the operation 

    AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease]; 

    // set progress block 

    [operation setUploadProgressBlock:progress]; 

    //set completion blocks 

    [operation setCompletionBlockWithSuccess:success failure:failure]; 

    // set it to work in background 

    [operation setShouldExecuteAsBackgroundTaskWithExpirationHandler:nil]; 

    // add it to the operations queue 

    [[AppClient sharedClient] enqueueHTTPRequestOperation:operation]; 
} 

는 *** 두 이미지 업로드 경로가 동일합니다

path = @ "FrontEnd? cmd = sendimage & fromuserid = 3 & touserid = 1 &"

는 coplete의 URL 생성하기 위해 base을 추가됩니다

:
image1에
enter image description here

" http://somename.myftp.org:8080/web_proj/FrontEnd?cmd=sendimage&fromuserid=3&touserid=1는"

이 내가 보낸 이미지입니다 @

image2
enter image description here

손상된 이미지
enter image description here

+0

보내는 이미지마다 별도의 버퍼를 사용하고 있는지 확인하십시오. 또한 수신자가 수신 된 각 이미지에 대해 별도의 버퍼를 사용하는지 확인하십시오. 마치 어딘가에 결합 된 것처럼 들립니다. 마지막으로, 3G/4G를 통해 송수신하는 경우 모든 이미지를 병렬로 전송하여 많은 처리량 향상을 얻지 못할 수도 있습니다. 얼마나 많은 스트림이 최적인지보기 위해 실험을해야 할 것입니다. – nielsbot

+0

ASIHTTPRequest 라이브러리를 사용하여이 작업을 성공적으로 마쳤으므로 아마도 서버 문제는 아닙니다. 클라이언트 측의 버퍼에 대해서는 잘 처리하지 못합니다. AFNetworking API를 사용하고 있습니다. 라이브러리가이를 관리하는지, 아니면해야 할 지 확실하지 않습니다. – Eyal

+0

어떻게 처리할까요? 서버 측? 어쩌면받은 이미지를 같은 파일에 씁니다. 첫 번째 이미지는 두 번째 이미지로 덮어 쓰기 시작하고, 두 번째 이미지는 첫 번째 이미지를 완전히 덮어 썼기 때문에 확인 메시지가 전송됩니다. – yonosoytu

답변

1

사용하십시오 multipartFormRequest 방법을 아래에 그 사용 :

이 같은 예를 들어
- (NSMutableURLRequest *)multipartFormRequestWithMethod:(NSString *)method 
               path:(NSString *)path 
             parameters:(NSDictionary *)parameters 
          constructingBodyWithBlock:(void (^)(id <AFMultipartFormDataProxy>formData))block; 

:

NSURLRequest* request = [[YourHTTPClient sharedHTTPClient] multipartFormRequestWithMethod:@"POST" 
        path:path 
        parameters:dict 
        constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
          [formData appendPartWithFileData:data1 
                 name:@"image1" 
                 fileName:@"image1.jpg" 
                 mimeType:@"image/jpeg"]; 
          [formData appendPartWithFileData:data2 
                 name:@"image2" 
                 fileName:@"image2.jpg" 
                 mimeType:@"image/jpeg"]; 
        } 
       }]; 
+0

하지만 multipartFormRequestWithMethod를 사용하면 하나의 요청으로 두 개의 이미지를 보내지 않고 두 개의 별도 요청으로 이미지가 전송됩니다 ... – Eyal

1

어떻게 당신이있는 UIImage 객체를 생성하는 것을 sendImageMsgWithPath : 메소드로 전달 되나요? 당신은 imageWithData를 사용하여 그것들을 만들고 있습니까? (또는 유사)? 그렇다면 NSMutableData를 다시 사용할 때 이런 문제가 발생했습니다. UIImage를 작성한 후에도 하위 시스템은 나중에 해당 데이터를 읽어야합니다. NSMutableData를 다시 사용하면 이미지가 손상됩니다.

이 경우 새 NSMutableData를 사용하여 각 UIImage를 만드는 것이 좋습니다.

+0

아니요 UIImagePickerController에서 이미지를 가져 오는 중입니다 ... – Eyal

관련 문제