5

我正在做的一个项目需要上传一个视频。用于上传视频的 post 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'

可以在以下方法中使用的所有多部分附加方法都使用 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];

是否可以有一个具有多部分主体的 NSURLSessionUploadTask 可以在使用 backgroundSessionConfiguration 的 AFHTTPSessionManager 中运行?

请参阅下面的示例代码:

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];
4

2 回答 2

6

无论 AFNetworking 如何,后台 NSURLSession 都有一些严格的限制。上传任务必须使用[NSURLSession uploadTaskWithRequest:fromFile:]我使用Charles来监视来自此方法的传出 HTTP 请求,并注意到它使用的是 application/octet-stream。没有办法解决这个问题,至少过去几天我没有遇到任何修补它。

于 2014-10-08T15:55:34.803 回答
2

我终于完成了这项工作。这可以通过使用 AFHTTPRequestSerializer:requestWithMultipartFormRequest:writingStreamContentsToFile:completionHandler: 来实现。请参阅https://github.com/AFNetworking/AFNetworking/issues/1874 - Lansing 的回答。

于 2015-08-18T04:26:59.023 回答