通过AFNetworking发送多个图像
我正在开发一个消息应用程序,用户也可以将图片发送给另一个。
当用户发送多张图片我在平行送他们(我不等待第一个完成上传之前,我送第二个)通过AFNetworking发送多个图像
移动到AFNetworking
之前,我成功地与ASIFormDataRequest
这样做,而且实际上如果我发送了2张图像,它们都是并行传输并成功传送给另一个用户。
当我尝试使用AFNetworking进行此操作时,出现了一些奇怪的行为。
我会尽力来形容的情况下被发送user1的两个图像过于用户2:
- 用户1发送此搜索 - >一切正常,我可以看到上传进度。
- 用户1然后发送图像2 - >仍然看起来不错,我可以看到两个图像
- 此搜索上传完成后的上传进度 - > user2的获取,看起来像图像1和图像2一起的组合损坏的图像!
- 图像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”
这是我发的图片:
此搜索
image2
损坏的图像
使用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"];
}
}];
但我确实使用multipartFormRequestWithMethod,我不想在一个请求中发送两个图像,图像发送两个单独的请求... – Eyal 2012-07-11 12:42:58
你是如何创建的UIImage对象传入你的sendImageMsgWithPath:方法?你使用imageWithData创建它们:(或类似的)?如果是这样,当我试图重用一个NSMutableData时,我看到了这样的问题。看来,即使在创建UIImage之后,子系统仍然需要稍后读取该数据。如果你已经重用了NSMutableData,那么该图像将被损坏。
如果是这种情况,我建议您使用新的NSMutableData来创建每个UIImage。
不,我从UIImagePickerController获取图像... – Eyal 2012-07-17 20:54:49
确保您为每个发送的图像使用单独的缓冲区。还要确保您的接收器为每个接收到的图像使用单独的缓冲区。听起来像他们正在合并在某个地方。最后,如果您通过3G/4G发送/接收数据,则并行发送所有图像可能无法提高吞吐量。你将不得不尝试看看有多少流是最优的。 – nielsbot 2012-07-15 22:24:53
我使用ASIHTTPRequest库成功完成此任务,因此它可能不是服务器问题。关于客户端的缓冲区,以及我没有真正处理这个,我只是使用AFNetworking API,不知道如果该库管理,或者如果我需要这样做... – Eyal 2012-07-16 10:20:39
你是如何处理这个服务器端?也许你正在将接收到的图像写入同一个文件中:第一个被第二个覆盖,第二个被发送正常,因为它完全覆盖了第一个。 – yonosoytu 2013-06-09 16:50:30