Upload de imagem via POST no Objective C

Atualmente estou trabalhando no upload de uma imagem para um servidor via HTTP Post e não consigo descobrir uma maneira de construir o URL que chama o serviço. O usuário seleciona uma imagem da biblioteca ou câmera e, em seguida, chama um serviço json que executa a instrução insert.

O serviço está esperando o seguinte uitemplate:

@"%@/DataTransfer/SetUserProfileImage?EMP_ID=%@&image=%@&imageName=%@" 

Espera-se que os dados da imagem sejam convertidos de alguma forma para string e enviados por url.

Este é o meu código atual:

 - (BOOL)setUserProfileImage:(UIImage *)imgUser Name:(NSString *)strName{ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; NSData *dataImage = UIImagePNGRepresentation(imgUser); NSString* theNSString = [[NSString alloc] initWithData:dataImage encoding:NSASCIIStringEncoding]; NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/DataTransfer /SetUserProfileImage?EMP_ID=%@&" "image=%@&imageName=%@", appDelegate.ServerAddress, appDelegate.UserId, theNSString, strName]]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy: NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]; [request setHTTPMethod:@"POST"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; NSURLResponse* response = nil; NSError* resultError = nil; NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&resultError]; NSString *strResult = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding]; BOOL imgResponse = [strResult boolValue]; [strResult release]; return imgResponse; } 

Recebo um erro dizendo que a NSURL é “”. Parece que não é possível criar um URL correto. Eu sei que o próprio serviço converte essa string para uma imagem novamente.

ATUALIZAR:

 - (BOOL)setUserProfileImage:(UIImage *)imgUser Name:(NSString *)strName{ AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; NSString *url = [NSString stringWithFormat:@"%@/DataTransfer/SetUserProfileImage",appDelegate.ServerAddress]; NSData *data = UIImagePNGRepresentation(imgUser); NSString * boundary = @"tweetPhotoBoundaryParm"; NSMutableData *postData = [NSMutableData dataWithCapacity:[data length] + 1024]; name=\"EMP_ID\"\r\n\r\n%@", @"100-01"]; NSString * boundaryString = [NSString stringWithFormat:@"\r\n--%@\r\n", boundary]; NSString * boundaryStringFinal = [NSString stringWithFormat:@"\r\n--%@--\r\n", boundary]; [postData appendData:[boundaryString dataUsingEncoding:NSUTF8StringEncoding]]; [postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"image\";\r\nfilename=\"media.png\"\r\nContent-Type: image/png\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [postData appendData:data]; [postData appendData:[boundaryStringFinal dataUsingEncoding:NSUTF8StringEncoding]]; NSMutableURLRequest * theRequest=(NSMutableURLRequest*)[NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; [theRequest setHTTPMethod:@"POST"]; [theRequest addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"]; //[theRequest addValue:@"www.tweetphoto.com" forHTTPHeaderField:@"Host"]; NSString * dataLength = [NSString stringWithFormat:@"%d", [postData length]]; [theRequest addValue:dataLength forHTTPHeaderField:@"Content-Length"]; [theRequest setHTTPBody:(NSData*)postData]; NSURLConnection * theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; if (theConnection) { webData =[[NSMutableData data] retain]; } else { NSLog(@"%@",@"Could not connect to the network"); } return false; } 

Objetivo-C

 -(void)saveImageToServer { // COnvert Image to NSData NSData *dataImage = UIImageJPEGRepresentation([UIImage imageNamed:@"yourImage"], 1.0f); // set your URL Where to Upload Image NSString *urlString = @"Your URL HERE"; // set your Image Name NSString *filename = @"YourImageFileName"; // Create 'POST' MutableRequest with Data and Other Image Attachment. NSMutableURLRequest* request= [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSString *boundary = @"---------------------------14737809831466499882746641449"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSMutableData *postbody = [NSMutableData data]; [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@.jpg\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[NSData dataWithData:dataImage]]; [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:postbody]; // Get Response of Your Request NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *responseString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"Response %@",responseString); } 

Rápido

 // COnvert Image to NSData var dataImage: NSData = UIImageJPEGRepresentation(UIImage(named: "yourImage"), 1.0) // set your URL Where to Upload Image var urlString: String = "Your URL HERE" // set your Image Name var filename: String = "YourImageFileName" // Create 'POST' MutableRequest with Data and Other Image Attachment. var request: NSMutableURLRequest = NSMutableURLRequest() request.URL = NSURL(string: urlString)! request.HTTPMethod = "POST" var boundary: String = "---------------------------14737809831466499882746641449" var contentType: String = "multipart/form-data; boundary=\(boundary)" request.addValue(contentType, forHTTPHeaderField: "Content-Type") var postbody: NSMutableData = NSMutableData.data() postbody.appendData("\r\n--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)) postbody.appendData("Content-Disposition: form-data; name=\"userfile\"; filename=\"\(filename).jpg\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)) postbody.appendData(String.stringWithString("Content-Type: application/octet-stream\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)) postbody.appendData(NSData.dataWithData(dataImage)) postbody.appendData("\r\n--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)) request.HTTPBody = postbody // Get Response of Your Request var returnData: NSData = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil) var responseString: String = String(data: returnData, encoding: NSUTF8StringEncoding) NSLog("Response %@", responseString) 

Essa abordagem tem vários problemas.

1) Converter os bytes brutos de uma imagem em uma string nunca funcionará.

 NSData *dataImage = UIImagePNGRepresentation(imgUser); NSString* theNSString = [[NSString alloc] initWithData:dataImage encoding:NSASCIIStringEncoding]; 

Vai falhar. Você nunca poderá reconstruir o dataImage partir theNSString . Você precisa basear 64 codificar dataImage. Use algo assim para fazer a codificação base 64.

2) Não coloque dados de imagem em um URL. Você precisa colocar os dados da imagem em um corpo do post.

3) Não use “application / x-www-form-urlencoded”, use “multipart / form-data”.


Atualizado após comentários

Desculpe, mas parece que você tem muito trabalho para entender seu sistema.

No exemplo acima, você adicionou todos os dados à string de consulta de URL, mas não adicionou nada ao corpo da mensagem. Nesse exemplo, você define o tipo de conteúdo como “application / x-www-form-urlencoded”.

Agora você parece achar que o POST precisa estar em JSON. Você precisa descobrir como isso deve ser feito. Como essa mensagem JSON precisa ser anexada? Antes de você disse que os dados precisavam estar na URL, esse ainda é o caso? Se você precisar append a mensagem JSON ao corpo do POST, qual deve ser o tipo de conteúdo do POST? Qual é a estrutura da mensagem JSON (todos os campos chave / valor necessários)?

Antes que alguém possa ajudá-lo, você precisa descobrir exatamente o que é necessário. Deve haver alguém que possa lhe dar uma descrição precisa da mensagem HTTP.