6

我正在开发一个消息应用程序,用户也可以互相发送图片。
当用户发送多张图片时,我将它们并行发送(我不会等待第一张完成上传,然后再发送第二张)

在迁移到之前,AFNetworking我成功地使用了ASIFormDataRequest,实际上如果我发送了 2 张图像,它们都被并行传输并成功传送给了另一个用户。

当我尝试使用 AFNetworking 执行此操作时,我得到了一些奇怪的行为。
我将尝试描述 user1 也发送两个图像 user2 的情况:

  1. User1 发送 image1 -> 一切正常,我可以看到上传进度。
  2. User1 然后发送 image2 -> 看起来还可以,我可以看到两个图像的上传进度
  3. image1 上传完成 -> user2 得到一个损坏的图像,看起来像是 image1 和 image2 的组合!
  4. image2 上传完成 -> user2 成功获取 image2

这就是我发送图像的方式

- (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&"

它将被添加到 baseURL 以创建完整的 URL:

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

这是我发送的图像:
image1
在此处输入图像描述

图2
在此处输入图像描述

损坏的图像
在此处输入图像描述

4

2 回答 2

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"];
                     }
                 }];
于 2012-07-11T12:36:51.853 回答
1

您如何创建传递给您的 sendImageMsgWithPath: 方法的 UIImage 对象?您是否使用 imageWithData: (或类似的)创建它们?如果是这样,我在尝试重用 NSMutableData 时遇到过这样的问题。似乎即使在您创建 UIImage 之后,子系统仍然需要稍后读取该数据。如果您此后重用了该 NSMutableData,则图像将被损坏。

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

于 2012-07-17T19:55:11.147 回答