我正在处理的项目需要上传视频。用于上传视频的后API调用需要多部分正文。我试图使用的代码包含在问题的底部。
该代码适用于[NSURLSessionConfiguration defaultSessionConfiguration]
。
如果我将配置更改为[NSURLSessionConfiguration backgroundSessionConfiguration:@"Test Id"]
,代码会崩溃,因为后台会话仅支持文件上传。错误是:
*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Upload tasks in background sessions must be from a file'
可以在以下方法中使用的所有multipart append方法都使用AFMultipartBodyStream类。此类流式传输上传,因此它不能在后台会话中使用,因为流不是文件。
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer]
multipartFormRequestWithMethod:@"POST"
parameters:params
constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
NSError *error = nil;
[formData appendPartWithFileURL:fileURL
name:@"uploadFile"
fileName:[fileURL lastPathComponent]
mimeType:@"video/quicktime"
error:&error];
} error:&error];
是否可以使用可以在使用backgroundSessionConfiguration的AFHTTPSessionManager中运行的多部分主体的NSURLSessionUploadTask?
请参阅以下示例代码:
NSURL *APIURL = [NSURL URLWithString:@"https://www.test.com/uploadVideo"];
NSError *error = nil;
NSDictionary *params = @{ @"token" : @"d5bcf6c2-99ec-4de7-bd87-71918b633b3a",
@"title" : @"Test_Video" };
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer]
multipartFormRequestWithMethod:@"POST"
parameters:params
constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
NSError *error = nil;
[formData appendPartWithFileURL:fileURL
name:@"uploadFile"
fileName:filePath
mimeType:@"video/quicktime"
error:&error];
} error:&error];
[request addValue:@"Basic 12345678901234567890" forHTTPHeaderField:@"Authorization"];
NSLog(@"%@", error);
__weak __typeof(self)weakSelf = self;
__block NSURLSessionUploadTask *task =
[super
uploadTaskWithStreamedRequest:request
progress:progress
completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
[weakSelf handleCompletionForTask:task
responseObject:responseObject
error:error
success:successBlock
failure:failureBlock];
}];
[task setTaskDescription:endpoint.name];
[task resume];
答案 0 :(得分:6)
背景NSURLSessions有一些严格的限制,无论AFNetworking如何。上传任务必须使用[NSURLSession uploadTaskWithRequest:fromFile:]
我使用Charles来监控来自此方法的传出HTTP请求,并注意到它使用的是application / octet-stream。没有办法解决这个问题,至少过去几天我没有碰到任何东西。
答案 1 :(得分:2)
我终于完成了这项工作。这可以通过使用AFHTTPRequestSerializer:requestWithMultipartFormRequest:writingStreamContentsToFile:completionHandler:。 请参阅https://github.com/AFNetworking/AFNetworking/issues/1874 - 兰辛的回答。