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