AFNetworking POST 写入服务器并返回失败错误(Cocoa 错误 3840)
Posted
技术标签:
【中文标题】AFNetworking POST 写入服务器并返回失败错误(Cocoa 错误 3840)【英文标题】:AFNetworking POST Writes to Server and Returns Failure Error (Cocoa Error 3840) 【发布时间】:2014-09-20 21:56:50 【问题描述】:我一直在努力将一些 jpg 图像上传到使用 AFNetworking 2.0 的服务器以及我在 *** 上遇到的一些代码,但我收到了 Cocoa 错误 3840。我查了一下,发现一些关于txt 文件,但我没有上传 txt 文件,所以这让我很困惑。当我执行此代码时,它会开始向服务器写入一段时间,直到它因以下语句而崩溃:
Failure Error Domain=NSCocoaErrorDomain Code=3840 "操作 无法完成。 (Cocoa 错误 3840。)”(JSON 文本未开始 带有数组或对象以及允许未设置片段的选项。) UserInfo=0x155b1360 NSDebugDescription=JSON 文本不是以 允许未设置片段的数组或对象和选项。
我还是 AFNetworking 的新手,所以有人可以解释一下导致此错误的原因吗?
我在编写此代码时遇到的另一个问题是我正在尝试使用dataWithContentsOfFile
方法保存NSData
,但在使用该方法后它一直返回nil
。我尝试了多种方法,如下所示。当我为fileRoot
使用pathForResource
(_filename
包含扩展名)时,它返回nil
,但另一种方法stringByAppendingPathComponent
按预期工作,但即使在将正确的路径作为@987654329 的参数之后@ 它仍然为 imageToUpload
返回 nil
。现在我只是使用UIImageJPEGRepresentation
让它工作。
谁能解释一下是什么原因造成的?
对不起,如果我不应该在一篇文章中发布 2 个单独的问题。我的第一个问题是最紧迫的。谢谢。
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:
_username, @"username",
_filename, @"filename",
_metadata, @"metadata",
nil];
// 1. Create `AFHTTPRequestSerializer` which will create your request.
AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
//NSString* fileRoot = [[NSBundle mainBundle] pathForResource:_filename ofType:nil];
//NSString *fileRoot=[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:_filename];
//NSData *imageToUpload = [NSData dataWithContentsOfFile:fileRoot];
NSData *imageToUpload = UIImageJPEGRepresentation(_savedFiles[_selectedRowNumber], 1.0);
// 2. Create an `NSMutableURLRequest`.
NSMutableURLRequest *request =
[serializer multipartFormRequestWithMethod:@"POST" URLString:@"http://69.91.198.44:8080/GeodatabaseServer/FileUpload"
parameters:parameters
constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
[formData appendPartWithFileData:imageToUpload
name:_filenameNoExt
fileName:_filename
mimeType:@"image/jpeg"];
error:nil];
// 3. Create and use `AFHTTPRequestOperationManager` to create an `AFHTTPRequestOperation` from the `NSMutableURLRequest` that we just created.
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFHTTPRequestOperation *operation =
[manager HTTPRequestOperationWithRequest:request
success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"Success %@", responseObject);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Failure %@", error.description);
];
// 4. Set the progress block of the operation.
[operation setUploadProgressBlock:^(NSUInteger __unused bytesWritten,
long long totalBytesWritten,
long long totalBytesExpectedToWrite)
NSLog(@"Wrote %lld/%lld", totalBytesWritten, totalBytesExpectedToWrite);
];
// 5. Begin!
[operation start];
【问题讨论】:
【参考方案1】:我可以通过设置以下属性来解决上传失败问题:
manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
我还能够通过不使用 bundle 方法而是从我的文档目录中抓取来解决我的第二个问题,如下所示:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:_filename];
【讨论】:
以上是关于AFNetworking POST 写入服务器并返回失败错误(Cocoa 错误 3840)的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 2.0:POST 返回成功响应但服务器未更新
如何使用 AFNetworking 通过 Post 请求在服务器上发送 NSData?