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

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

2 に答える 2

2

これは、AFHTTPRequestSerializer:requestWithMultipartFormRequest:writingStreamContentsToFile:completionHandler: を使用することで可能になります。https://github.com/AFNetworking/AFNetworking/issues/1874 - Lansing の回答を参照してください。

于 2015-08-18T04:26:59.023 に答える