2012-07-11 74 views
6

我正在开发一个消息应用程序,用户也可以将图片发送给另一个。
当用户发送多张图片我在平行送他们(我不等待第一个完成上传之前,我送第二个)通过AFNetworking发送多个图像

移动到AFNetworking之前,我成功地与ASIFormDataRequest这样做,而且实际上如果我发送了2张图像,它们都是并行传输并成功传送给另一个用户。

当我尝试使用AFNetworking进行此操作时,出现了一些奇怪的行为。
我会尽力来形容的情况下被发送user1的两个图像过于用户​​2:

  1. 用户1发送此搜索 - >一切正常,我可以看到上传进度。
  2. 用户1然后发送图像2 - >仍然看起来不错,我可以看到两个图像
  3. 此搜索上传完成后的上传进度 - > user2的获取,看起来像图像1和图像2一起的组合损坏的图像!
  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 &”

将被添加到基本URL创建coplete网址:

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

这是我发的图片:
此搜索
enter image description here

image2
enter image description here

损坏的图像
enter image description here

+0

确保您为每个发送的图像使用单独的缓冲区。还要确保您的接收器为每个接收到的图像使用单独的缓冲区。听起来像他们正在合并在某个地方。最后,如果您通过3G/4G发送/接收数据,则并行发送所有图像可能无法提高吞吐量。你将不得不尝试看看有多少流是最优的。 – nielsbot 2012-07-15 22:24:53

+0

我使用ASIHTTPRequest库成功完成此任务,因此它可能不是服务器问题。关于客户端的缓冲区,以及我没有真正处理这个,我只是使用AFNetworking API,不知道如果该库管理,或者如果我需要这样做... – Eyal 2012-07-16 10:20:39

+0

你是如何处理这个服务器端?也许你正在将接收到的图像写入同一个文件中:第一个被第二个覆盖,第二个被发送正常,因为它完全覆盖了第一个。 – yonosoytu 2013-06-09 16:50:30

回答

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 2012-07-11 12:42:58

1

你是如何创建的UIImage对象传入你的sendImageMsgWithPath:方法?你使用imageWithData创建它们:(或类似的)?如果是这样,当我试图重用一个NSMutableData时,我看到了这样的问题。看来,即使在创建UIImage之后,子系统仍然需要稍后读取该数据。如果你已经重用了NSMutableData,那么该图像将被损坏。

如果是这种情况,我建议您使用新的NSMutableData来创建每个UIImage。

+0

不,我从UIImagePickerController获取图像... – Eyal 2012-07-17 20:54:49