servicio consumir iphone objective-c ipad file-upload http-post

iphone - consumir servicio rest swift 4



Objetivo C: ¿Cómo subir imágenes y texto usando HTTP POST? (4)

Creé exitosamente dos métodos diferentes donde cada uno de ellos puede cargar una imagen o texto. ¡Pero tengo problemas para escribir un método que puede publicar texto e imágenes simultáneamente!

// Aquí está mi nuevo método que funcionó bien gracias a @sgosha:

- (void) upload { NSString *urlString = @"http://www.examplescript.com"; NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSMutableData *body = [NSMutableData data]; NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"]; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; [request addValue:contentType forHTTPHeaderField:@"Content-Type"]; // file NSData *imageData = UIImageJPEGRepresentation(imageView.image, 90); [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"Content-Disposition: attachment; name=/"userfile/"; filename=/".jpg/"/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream/r/n/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:imageData]]; [body appendData:[[NSString stringWithString:@"/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; // Text parameter1 NSString *param1 = @"parameter text"; [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=/"parameter1/"/r/n/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:param1] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; // Another text parameter NSString *param2 = @"Parameter 2 text"; [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=/"parameter2/"/r/n/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:param2] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; // close form [body appendData:[[NSString stringWithFormat:@"--%@--/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // set request body [request setHTTPBody:body]; //return and test NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"%@", returnString); }

// Vieja pregunta: ¡Obviamente esto fue demasiado fácil y no funcionó! No obtengo ningún error en la consola ni nada, y la imagen se carga, pero el texto no se envía. ¿Algunas ideas?

Por cierto: el script del lado del servidor es un script php muy simple.


Este código funciona para mí con 1 imagen y 7 otros parámetros usando POST Request

Asegúrese de cambiar sus nombres de variable más los valores y también el nombre del parámetro de la imagen más ''showPhoto'' que es mi IBOutlet UIImageView ''nombre del objeto'' muestra el nombre del parámetro URL.

NSString * str = @ " http://xxx.xxx.xxx.xx/xxxx/xxxxx/xxxxx.php?action=add_place "; NSString * urlString = [NSString stringWithFormat: @ "% @", str];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSMutableData *body = [NSMutableData data]; NSString *boundary = @"---------------------------14737809831466499882746641449"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSData *imageData = UIImageJPEGRepresentation(_showPhoto.image, 90); [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Disposition: form-data; name=/"host_pic/"; filename=/"parkN.jpg/"/r/n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: application/octet-stream/r/n/r/n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:imageData]; [body appendData:[@"/r/n" dataUsingEncoding:NSUTF8StringEncoding]]; // parameter username [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=/"userID/"/r/n/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"17" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"/r/n" dataUsingEncoding:NSUTF8StringEncoding]]; // parameter token [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=/"longitude/"/r/n/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"50.0011" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"/r/n" dataUsingEncoding:NSUTF8StringEncoding]]; // parameter token [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=/"latitude/"/r/n/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"50.0011" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"/r/n" dataUsingEncoding:NSUTF8StringEncoding]]; // parameter method [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=/"place_name/"/r/n/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"lahore" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"/r/n" dataUsingEncoding:NSUTF8StringEncoding]]; //parameter method [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=/"place_description/"/r/n/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"lahore" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"/r/n" dataUsingEncoding:NSUTF8StringEncoding]]; //parameter method [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=/"zip_code/"/r/n/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"123456" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"/r/n" dataUsingEncoding:NSUTF8StringEncoding]]; //parameter method [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=/"phone_number/"/r/n/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"033333333" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"/r/n" dataUsingEncoding:NSUTF8StringEncoding]]; // close form [body appendData:[[NSString stringWithFormat:@"--%@--/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // setting the body of the post to the reqeust [request setHTTPBody:body]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; // NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableLeaves error:nil]; NSLog(@"%@",dict);


Pruebe esto (EDITADO):

NSMutableData *body = [NSMutableData data]; // file [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"Content-Disposition: attachment; name=/"userfile/"; filename=/".jpg/"/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream/r/n/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:imageData]]; [body appendData:[[NSString stringWithString:@"/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; // text parameter [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=/"parameter1/"/r/n/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[parameterValue1 dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; // another text parameter [body appendData:[[NSString stringWithFormat:@"--%@/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=/"parameter2/"/r/n/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[parameterValue2 dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"/r/n"] dataUsingEncoding:NSUTF8StringEncoding]]; // close form [body appendData:[[NSString stringWithFormat:@"--%@--/r/n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // set request body [request setHTTPBody:body];


Si quieres nombrar la imagen:

NSMutableString *nombreImagen= [[NSMutableString alloc]init]; [nombreImagen appendString:@"Content-Disposition: attachment; name=/"file/"; filename=/""]; [nombreImagen appendString:@"hoy"]; [nombreImagen appendString:@".jpg/"/r/n"]; ....... [body appendData:[[NSString stringWithString:nombreImagen] dataUsingEncoding:NSUTF8StringEncoding]];


También quería subir una imagen junto con otros datos en el mismo POST, la mayoría de la información sobre la carga de imágenes es solo para cargar una imagen sola en una conexión de servidor, así es como lo resolví.

Este es el PHP

<?php /* As you can see there are more values not only the image */ $variableOne = $_POST[''variableOne'']; $variableTwo = $_POST[''variableTwo'']; $variableThree = $_POST[''variableThree'']; $variableFour = $_POST[''variableFour'']; $variableFive = $_POST[''variableFive'']; $variableSix = $_POST[''variableSix'']; $variableSeven = $_POST[''variableSeven'']; $variableEight = $_POST[''variableEight'']; $variableNine = $_POST[''variableNine'']; $variableTen = $_POST[''variableTen'']; /* Our image */ $image = $_REQUEST[''image'']; /* This is for trying to get a unique name for the image file, since maybe you want to store large amount of images */ $currentDate = date("Y-m-d"); $name = "" . $currentDate . microtime() . rand(0, 999) . rand(0, 999) . rand(0, 999) . ".jpg"; /* * Here comes the image stuff */ if (file_exists($name)) { echo "File already exists"; } else { /* Decoding image */ $binary = base64_decode($image); /* Opening image */ $file = fopen($name, ''wb''); /* Writing to server */ fwrite($file, $binary); /* Closing image file */ fclose($file); echo "Added"; } } ?>

Luego, en Xcode, copie y pegue este método (tomado de Crear una cadena base-64 desde NSData )

- (NSString*)base64forData:(NSData*) theData { const uint8_t* input = (const uint8_t*)[theData bytes]; NSInteger length = [theData length]; static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4]; uint8_t* output = (uint8_t*)data.mutableBytes; NSInteger i; for (i=0; i < length; i += 3) { NSInteger value = 0; NSInteger j; for (j = i; j < (i + 3); j++) { value <<= 8; if (j < length) { value |= (0xFF & input[j]); } } NSInteger theIndex = (i / 3) * 4; output[theIndex + 0] = table[(value >> 18) & 0x3F]; output[theIndex + 1] = table[(value >> 12) & 0x3F]; output[theIndex + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : ''=''; output[theIndex + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : ''=''; } return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; }

En el archivo YourViewController.h

@interface YourViewController : UIViewController { NSURLConnection *serverConnection; NSMutableData *returnData; }

Este es el código de conexión del servidor

NSURL *sendURL = [NSURL URLWithString:@"http://yourdomainname/imagefolder/phpscript.php"]; NSMutableURLRequest *sendRequest = [NSMutableURLRequest requestWithURL:sendURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30]; [sendRequest setHTTPMethod:@"POST"]; [sendRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; NSData *imageData = UIImageJPEGRepresentation(yourImage, 1.0); NSString *encodedString = [[self base64forData:imageData] stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]; NSString *dataToSend = [[NSString alloc] initWithFormat:@"variableOne=%@&variableTwo=%@&variableThree=%@&variableFour=%@&variableFive=%@&variableSix=%@&variableSeven=%@&variableEight=%@&variableNine=%@&variableTen=%@&image=%@", valueOne, valueTwo, valueThree, valueFour, valueFive, valueSix, valueSeven, valueEight, valueNine, valueTen, encodedString]; [sendRequest setHTTPBody:[dataToSend dataUsingEncoding:NSUTF8StringEncoding]]; serverConnection = [[NSURLConnection alloc] initWithRequest:sendRequest delegate:self]; [serverConnection start];

Establecer métodos de delegado para la conexión del servidor

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { returnData = [[NSMutableData alloc] init]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [returnData appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { if (connection == serverConnection) { NSString *responseString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"Response: %@", responseString); if ([responseString isEqualToString:@"Added"]) { /* Make something on success */ } else { /* Make something else if not completed with success */ } } } - (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { /* Make something on failure */ }