ios - AFNetworking V 2 是否支持非流式多部分后台上传任务?

标签 ios multipartform-data afnetworking-2 nsurlsessionuploadtask

我正在进行的项目需要上传视频。用于上传视频的 post API 调用需要一个多部分正文。我尝试使用的代码包含在问题的底部。

该代码非常适用于 [NSURLSessionConfiguration defaultSessionConfiguration]

如果我将配置更改为 [NSURLSessionConfiguration backgroundSessionConfiguration:@"Test Id"],代码会崩溃,因为后台 session 仅支持文件上传。错误是:

*** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“后台 session 中的上传任务必须来自文件”

可以在以下方法中使用的所有多部分追加方法都使用 AFMultipartBodyStream 类。此类对上传进行流式处理,因此不能在后台 session 中使用,因为流不是文件。

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

最佳答案

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

关于ios - AFNetworking V 2 是否支持非流式多部分后台上传任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24708845/

相关文章:

ios - 更改 UISegmentedControl 的颜色并以编程方式删除边缘 iOS7+

ios - Grails多部分服务流意外结束

Android 上的 Java 访问分段上传的共享首选项时出错

ios - 为什么 AFNetworking 在 url 中输入 '|' 管道符号时会得到不受支持的 url

ios - 在 iOS 中重现 Tumblr 标签效果

objective-c - 使用完成 block 创建自定义方法

ios - swift 4.1 ISO8601DateFormatter 不解析 MRAID 广告内容传递的日期

javascript - 如何使用 angular 和 FormData 简化发送(文件、模型)

ios - UITableViewCell 上的 UIProgressView

ios - 具有多个快速连续请求的 AFHTTPSessionManager (AFNetworking 2.0)