2012-07-11 20 views
6

私はメッセージングアプリを開発しており、ユーザーは画像をお互いに送信することもできます。私はASIFormDataRequestでこれをやってことに成功し
ユーザーがAFNetworkingに移動する前に、私は、それらを並行して送る複数の画像(私は二番目を送信する前に私がアップロードを終了する最初のものを待たない)AFNetworkingで複数の画像を送信

を送信実際に2枚の画像を送信した場合、その両方が並行して送信され、他のユーザーに正常に配信されました。

AFNetworkingでこれを実行しようとすると、私は奇妙な動作をします。
私はUSER1すぎuser2の2枚の画像を送信された場合について説明しようとするでしょう:

  1. User1のイメージ1を送信する - すべてがOKに見えます>、私は、アップロードの進行状況を確認することができます。
  2. User1は画像2を送信します - >まだOKです。両方の画像のアップロードの進行状況を確認できます
  3. image1アップロードが完了しました - > user2はimage1とimage2の組み合わせのような壊れた画像を取得します。
  4. アップロードが終了した画像2 - > User2が画像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を作成するために、ベースURLに追加されます。

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

@これは私が送信された画像である:
image1の
enter image description here

image2
enter image description here

壊れた画像
enter image description here

+0

送信する画像ごとに別々のバッファを使用していることを確認してください。また、受信者が受信した画像ごとに別々のバッファを使用していることを確認してください。彼らはどこかで組み合わされているように聞こえる。最後に、3G/4G経由で送受信している場合、すべての画像を並行して送信することで、スループットの向上が得られない場合があります。最適なストリームの数を確認するためには、実験を行う必要があります。 – nielsbot

+0

ASIHTTPRequestライブラリでこれを成功させるので、おそらくサーバーの問題ではありません。クライアント側のバッファについては、よく私は本当に私はちょうどAFNetworkingのAPIを使用しています、これを処理していない、わからないライブラリはそれを管理している場合か、私はそれを行う必要がある場合... – Eyal

+0

はどのようにこれを処理していますサーバ側?受信した画像を同じファイルに書き込んでいる可能性があります。最初のファイルは上書きされます。もう1つは上書きされます。 – 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を使用するのです、私は1つのリクエストで2枚の画像を送信したくない、画像が – Eyal

1

をどのようにUIImageオブジェクトを作成していることあなたのsendImageMsgWithPath:メソッドに渡されますか?あなたはimageWithDataを使ってそれらを作成していますか? NSMutableDataを再利用しようとすると、このような問題が発生しました。 UIImageを作成した後でも、サブシステムは後でそのデータを読み取る必要があるようです。 NSMutableDataを再利用した場合、イメージは破損します。

このような場合は、私はあなたがそれぞれのUIImageを作成するために、新しいNSMutableDataを使用することをお勧めします。

+0

いいえ、私はUIImagePickerControllerから画像を取得しています...二つの別々のリクエストで送信されます... – Eyal

関連する問題