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)
然后一切正常,重新运行后我得到了成功的回应.
您确认在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.
| 归档时间: |
|
| 查看次数: |
8079 次 |
| 最近记录: |