之所以要求你这样做是因为我对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];
然后一切正常,重新运行后我得到了成功的反应。
答案 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
。