não é possível fazer o upload do arquivo usando os dados do formulário de várias partes do NSURLSession no iOS

Estou tentando fazer upload de um arquivo de vídeo / imagem usando- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL; método usando dados de formulário com várias partes. Mas, de alguma forma, não consigo carregar o arquivo e estou recebendo "stream ended unexpectedly"erro.

Exigências

Carregar um arquivo de vídeo / imagem no servidorO aplicativo deve oferecer suporte a uploads em segundo plano (continue o processo de upload mesmo após o aplicativo entrar em segundo plano)O servidor espera que os dados sejam enviados usando dados de formulário com várias partes.

Métodos / APIs usados para conseguir isso

API da sessão em segundo plano NSURLSession (código completo listado abaixo)

2)- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL

Desafios / problemas enfrentados

voltado para "stream ended unexpectedly"erro toda vez que estou usando esta API para o processo de upload

Pontos a serem observados

O upload está sendo bem-sucedido com o mesmo código, se eu estiver usandoNSURLConnection ao invés deNSURLSession.

NSURLSession O processo de upload em segundo plano espera o local do arquivo (NSURL) como parâmetro, não aceita NSData. Não nos permite converter o arquivo emNSData antes do upload, ou seja, não podemos adicionar o NSData ao corpo do arquivo.

Precisa de ajuda nos seguintes pontos

Existe algum erro no corpo de dados do formulário de várias partes que está sendo formado (observação - o mesmo código está funcionando com NSURLConnection)

Onde estou errado na minha abordagem?

Precisamos fazer alterações no nível do servidor para suportarNSURLSession backgroundSession uploads? (na análise de dados ou algo mais?)

Aqui está o código que está sendo usado para fazer upload de um arquivo

NSString * BoundaryConstant = @ "---------- V2ymHFg03ehbqgZCaKO6jy";

    // string constant for the post parameter 'file'. My server uses this name: `file`. Your's may differ
    NSString* FileParamConstant = @"file";

    // the server url to which the image (or video) is uploaded. Use your server url here

    url=[NSURL URLWithString:[NSString stringWithFormat:@"%@%@%d",baseURL,@"posts/post/update/",createPostObject.PostID]];    


    // create request
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
    [request setHTTPShouldHandleCookies:NO];
    [request setTimeoutInterval:120];
    [request setHTTPMethod:@"POST"];
    [request addValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];

    [request setURL:url];

    // set Content-Type in HTTP header
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", BoundaryConstant];
    [request setValue:contentType forHTTPHeaderField: @"Content-Type"];

    if([[NSUserDefaults standardUserDefaults] objectForKey:@"accessToken"]){

        [request setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"accessToken"] forHTTPHeaderField:AccessTokenKey];

    }

    // post body
    NSMutableData *body = [NSMutableData data];

    // add params (all params are strings)
    for (NSString *param in self.postParams) {

        NSLog(@"param is %@",param);

        [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param]             dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"%@\r\n", [self.postParams objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
    }

    // add video file name to body

        [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"file.mp4\"\r\n", FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithString:@"Content-Type: video/mp4\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
      //  [body appendData:self.dataToPost];
        [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

        [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];



    // setting the body of the post to the request
    [request setHTTPBody:body];

    // set the content-length
    NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[body length]];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];

    NSLog(@"Request body %@", [[NSString alloc] initWithData:[request HTTPBody] encoding:NSUTF8StringEncoding]);

    NSURLSessionConfiguration * backgroundConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"backgroundtask1"];

    NSURLSession *backgroundSeesion = [NSURLSession sessionWithConfiguration: backgroundConfig delegate:self delegateQueue: [NSOperationQueue mainQueue]];


    NSURLSessionUploadTask *uploadTask = [backgroundSeesion uploadTaskWithRequest:request fromFile:self.videoUrl];
    [uploadTask resume];

questionAnswers(2)

yourAnswerToTheQuestion