私が取り組んでいるプロジェクトでは、ビデオをアップロードする必要があります。動画をアップロードするための 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];
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];