Carga de imágenes a través de POST en el objective C

Actualmente estoy trabajando para subir una imagen a un servidor a través de HTTP Post y parece que no puedo encontrar una manera de construir la url que llama al servicio. El usuario selecciona una imagen de la biblioteca o cámara y luego llama a un servicio json que realiza la instrucción de inserción.

El servicio espera la siguiente uritemplate:

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

Se espera que los datos de la imagen se conviertan de alguna manera en una cadena y se envíen a través de la url.

Este es mi código actual:

 - (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; } 

Me aparece un error que dice que NSURL es “”. Parece que no puede construir una URL correcta. Sé que el servicio en sí mismo convierte esta cadena en una imagen de nuevo.

ACTUALIZAR:

 - (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; } 

C objective

 -(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) 

Este enfoque tiene varios problemas.

1) Convertir los bytes sin formato de una imagen en una cadena nunca funcionará.

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

Fallará. Nunca podrás reconstruir dataImage desde theNSString . Necesita basar 64 codificar dataImage. Use algo como esto para hacer la encoding base 64.

2) No coloque datos de imagen en una URL. Debes poner los datos de la imagen en un cuerpo de publicación.

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


Actualizado después de Comentarios

Lo siento, pero parece que tienes mucho trabajo por hacer para comprender tu sistema.

En el ejemplo anterior, agregó todos los datos a la cadena de consulta de URL, pero no agregó nada al cuerpo del mensaje. En ese ejemplo, configura el tipo de contenido como “application / x-www-form-urlencoded”.

Ahora pareces pensar que el POST necesita estar en JSON. Debes averiguar cómo hacerlo. ¿Cómo se debe adjuntar ese mensaje JSON? Antes de decir que los datos debían estar en la URL, ¿sigue siendo así? Si necesita adjuntar el mensaje JSON al cuerpo POST, ¿cuál debe ser el tipo de contenido del POST? ¿Cuál es la estructura del mensaje JSON (todos los campos clave / valor necesarios)?

Antes de que alguien pueda ayudarlo, debe averiguar exactamente qué se necesita. Debería haber alguien que pueda darle una descripción precisa del mensaje HTTP.