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

Mat*_*der 3 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];
Run Code Online (Sandbox Code Playgroud)

当我打印文件路径时:

file:///Users/mac/Library/Application%20Support/iPhone%20Simulator/7.0.3/Applications/F732FCF6-EAEE-4E81-A88B-76ADB75EDFD1/Documents/test.jpg
Run Code Online (Sandbox Code Playgroud)

然后我设置我的参数并使用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);
}];
Run Code Online (Sandbox Code Playgroud)

它是否正确?或者我可能会错过一些东西因为回应不成功?

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

[formData appendPartWithFileData:imageData name:@"image" fileName:@"test.jpg" mimeType:@"image/jpeg"];
Run Code Online (Sandbox Code Playgroud)

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

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: body'
Run Code Online (Sandbox Code Playgroud)

我之所以认为在管理器块外定义的imageData在这一行是零.所以我在这里需要帮助以及如何将其传递到块中.

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

当我评论这条线时

[formData appendPartWithFileData:imageData name:@"image" fileName:@"test.jpg" mimeType:@"image/jpeg"];
Run Code Online (Sandbox Code Playgroud)

要么

[formData appendPartWithFileURL:filePath name:@"image" error:nil];
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*Rob 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);
}];
Run Code Online (Sandbox Code Playgroud)

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

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