AFnetworking 2.2.0在服务器问题上传图像

时间:2014-03-04 18:47:54

标签: ios afnetworking afnetworking-2

之所以要求你这样做是因为我对params感到困惑。

据我所知,有一种方法可以使用多部分请求。

这种方式为我们提供了两个概念,因为我理解从文件上传,可以存储在Document目录中或使用NSData对象。

从文件上传:

所以我将test.jpg保存到文档目录中。然后我让NSURL实例在多部分请求中使用它。下面的代码显示了我如何创建NSURL实例:

NSString *fileName = @"test.jpg";
NSString *folderPath = [documentsDirectory stringByAppendingPathComponent:fileName];
NSURL *filePath = [NSURL fileURLWithPath:folderPath];

当我打印文件路径时:

file:///Users/mac/Library/Application%20Support/iPhone%20Simulator/7.0.3/Applications/F732FCF6-EAEE-4E81-A88B-76ADB75EDFD1/Documents/test.jpg

然后我设置我的参数并使用formData附加我的文件,如下所示:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFileURL:filePath name:@"image" error:nil];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

这是对的吗?或者我可能会因为回应不成功而错过了什么?

第二个概念 - 直接处理数据:

[formData appendPartWithFileData:imageData name:@"image" fileName:@"test.jpg" mimeType:@"image/jpeg"];

但是当应用程序调用这行代码时,我收到错误:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: body'

我认为在管理器块外部定义的imageData在此行上为零的原因。所以我在这里需要帮助以及如何将其传递到块中。

请你纠正我的步骤中的错误,也许我会错过一些东西。

当我评论该行

[formData appendPartWithFileData:imageData name:@"image" fileName:@"test.jpg" mimeType:@"image/jpeg"];

[formData appendPartWithFileURL:filePath name:@"image" error:nil];

然后一切正常,重新运行后我得到了成功的反应。

1 个答案:

答案 0 :(得分:6)

您是否确认在Documents文件夹中的该位置找到了该文件?我也无法将以编程方式确定的文件路径(这是正确的)与字符串文字文件路径(很容易出问题)进行协调。您应始终以编程方式确定路径,而不是使用字符串文字(因为当您重新安装应用程序时,该路径将更改)。我认为你需要的是:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"image.png"];
NSURL *fileURL = [NSURL fileURLWithPath:filePath];

[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    NSError *error;
    BOOL success = [formData appendPartWithFileURL:fileURL name:@"image" fileName:filePath mimeType:@"image/png" error:&error];
    if (!success)
        NSLog(@"appendPartWithFileURL error: %@", error);
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

注意,这以编程方式确定filePath(这是路径,而不是URL),然后使用fileURLWithPath将其转换为文件URL。它还确认是否成功,如果不成功则记录错误。

另请注意,这假设您的服务器将其响应作为JSON返回。如果没有,则必须更改responseSerializer