uploadTaskWithStreamedRequest 中的 AFNetworking 错误

Posted

技术标签:

【中文标题】uploadTaskWithStreamedRequest 中的 AFNetworking 错误【英文标题】:AFNetworking error in uploadTaskWithStreamedRequest 【发布时间】:2015-04-02 07:19:45 【问题描述】:

错误

Terminating app due to uncaught exception 'NSGenericException', reason: 'Upload tasks in background sessions must be from a file'

当我尝试时

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

configuration for NSURLSession 工作正常,但是当我使用下面的configuration 时,应用程序崩溃并给我错误。

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:kBackgroundSessionIdentifier];

【问题讨论】:

【参考方案1】:

您应该只使用uploadTaskWithRequest:fromFile:。这里的问题是您必须将您的多部分请求内容写入临时文件,然后上传该文件。

您应该使用AFHTTPRequestSerializer:requestWithMultipartFormRequest:writingStreamContentsToFile:completionHandler:。 参考https://github.com/AFNetworking/AFNetworking/issues/1874 - Lansing 的回答

这是对我有用的示例代码:

NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:TEMP_DATA_FILE];
[data writeToFile:filePath atomically:YES];
NSURL *filepathURL = [NSURL fileURLWithPath:filePath];

NSString *tempFile = [NSTemporaryDirectory() stringByAppendingPathComponent:TEMP_MULTI_PART_REQUEST_FILE];
NSURL *filePathtemp = [NSURL fileURLWithPath:tempFile];


AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
NSError *error = nil;

NSMutableURLRequest *request =
[serializer multipartFormRequestWithMethod:@"POST" URLString:AppendStrings(HOST_FOR_SERVICE_ACCESS, SERVICE_FOR_MULTIPART_UPLOAD)
                                    parameters:parameters
                     constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
     [formData appendPartWithFileURL:filepathURL name:@"data" error:nil];
                                         error:&error ];

__block NSProgress *progress = nil;
[serializer requestWithMultipartFormRequest:request writingStreamContentsToFile:filePathtemp completionHandler:^(NSError *error) 

NSURLSessionUploadTask *uploadTask = [self.sessionManager uploadTaskWithRequest:request fromFile:filePathtemp progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) ];
[uploadTask resume];

记得之后清理你的临时文件。

【讨论】:

【参考方案2】:

“在后台会话中上传任务必须来自文件”的异常本身就是这个问题的答案。

以下行创建后台会话配置。

[NSURLSessionConfiguration backgroundSessionConfiguration:kBackgroundSessionIdentifier];

不支持uploadTaskWithStreamedRequest:,但适用于uploadTaskWithRequest:request fromFile:

来自 Apple 文档的后台上传仅适用于文件。 如果您想在后台上传,请将您的数据写入文件,然后将该磁贴的 url 传递给您的后台会话

【讨论】:

当我使用 uploadTaskWithRequest:request fromFile 然后响应为零

以上是关于uploadTaskWithStreamedRequest 中的 AFNetworking 错误的主要内容,如果未能解决你的问题,请参考以下文章