Cargar imagen desde la aplicación de iOS a php: no puedo hacerlo bien – ¿Qué me estoy perdiendo?

En primer lugar, sé que esta pregunta ha sido formulada miles de veces. Lo vuelvo a preguntar porque probé las soluciones en los otros ejemplos y no funcionan para mí y no sé por qué. Todos parecen tener un enfoque ligeramente diferente.

NSData *imageData = UIImagePNGRepresentation(form.image); NSURL *url = [NSURL URLWithString:@"myscript.php"]; NSMutableString *postParams = [[NSMutableString alloc] initWithFormat:@"&image=%@", imageData]]; NSData *postData = [postParams dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [[NSString alloc] initWithFormat:@"%d", [postData length]]; NSMutableURLRequest *connectRequest = [[NSMutableURLRequest alloc] init]; [connectRequest setURL:url]; [connectRequest setHTTPMethod:@"POST"]; [connectRequest setValue:postLength forHTTPHeaderField:@"Content-Length"]; [connectRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; //[connectRequest setValue:@"image/png" forHTTPHeaderField:@"Content-Type"]; [connectRequest setHTTPBody:postData]; NSData *receivedData; NSDictionary *jsonData; NSURLConnection *connectConnection = [[NSURLConnection alloc] initWithRequest:connectRequest delegate:self]; NSError *error = nil; if (!connectConnection) { receivedData = nil; NSLog(@"The connection failed!"); } else { NSLog(@"Connected!"); receivedData = [NSURLConnection sendSynchronousRequest:connectRequest returningResponse:NULL error:&error]; } if (!receivedData) { NSLog(@"Data fetch failed: %@", [error localizedDescription]); } else { NSLog(@"The data is %lu bytes", (unsigned long)[receivedData length]); NSLog(@"%@", receivedData); if (NSClassFromString(@"NSJSONSerialization")) { id object = [NSJSONSerialization JSONObjectWithData:receivedData options:0 error:&error]; if (!object) { NSLog(@"JSON Serialization failed: %@", [error localizedDescription]); } if ([object isKindOfClass:[NSDictionary class]]) { jsonData = object; NSLog(@"json data: %@", jsonData); } } } 

En este momento estoy pasando el NSData en el postParams y usando este script php:

 if (isset($_POST['image']) && !empty($_POST['image'])) { if (file_put_contents('images/test.png', $_POST['image'])) { echo '{"saved":"YES"}'; die(); } else { echo '{"saved":"NO"}'; die(); } } 

Esto está guardando los datos en un archivo pero no puedo abrirlo ya que está dañado o algo por el estilo. Este fue casi un último esfuerzo y no esperaba que funcionara de esta manera, pero es lo más cercano que he hecho hasta ahora para hacerlo bien.

Intenté usar varios métodos content-header / boundary / $ _FILES / enctype content-type, pero ni siquiera puedo enviar el script correctamente.

  • por cierto, no solo estoy enviando los datos de imagen, también estoy publicando otros valores en los postparámetros que son solo cadenas, entradas, etc.

¿Alguien tiene alguna sugerencia o sabe de alguna buena fuente para esto?

Gracias por cualquier ayuda ofrecida.


Estado actual después de seguir los consejos dados en las respuestas a continuación (también, información adicional de otras partes del progtwig):

Captura inicial de la imagen:

 - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.view endEditing:YES]; __unused form *form = self.form; form.signature = self.signatureDrawView.bp; UIGraphicsBeginImageContext(self.signatureDrawView.bounds.size); [self.signatureDrawView.layer renderInContext:UIGraphicsGetCurrentContext()]; campaignForm.signatureImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } 

donde el signatureDrawView es un UIView y el form.signature es un UIBezierpath.


entonces…

 NSData *sigImage = UIImagePNGRepresentation(campaignForm.signatureImage); 

que se pasa a la siguiente función:

 - (void)uploadImage:(NSData *)imageData { NSMutableURLRequest *request; NSString *urlString = @"https://.../upload.php"; NSString *filename = @"uploadTest"; 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=\"file\"; filename=\"%@.png\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[NSData dataWithData:imageData]]; [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:postbody]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString; returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"%@", returnString); } 

upload.php con el siguiente aspecto:

  if ($_FILES["file"]["error"] > 0) { echo '{"file":"'.$_FILES['file']['error'].'"}'; die(); } else { $size = $_FILES["file"]["size"] / 1024; $upload_array = array( "Upload"=>$_FILES["file"]["name"], "Type"=>$_FILES["file"]["type"], "Size"=>$size, "Stored in"=>$_FILES["file"]["tmp_name"] ); //echo json_encode($upload_array); if (move_uploaded_file($_FILES["file"]["tmp_name"], "signatures/" . $_FILES["file"]["name"])) { echo '{"success":"YES"}'; die(); } else { echo '{"success":"NO"}'; die(); } die(); } 

Esto me está dando el resultado {success: NO} y el volcado $ upload_array muestra valores nulos.

Ponga el siguiente código, puede obtener ayuda

 NSData *myData=UIImagePNGRepresentation([self.img image]); NSMutableURLRequest *request; NSString *urlString = @"http://xyzabc.com/iphone/upload.php"; NSString *filename = @"filename"; request= [[[NSMutableURLRequest alloc] init] autorelease]; [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:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[NSData dataWithData:myData]]; [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:postbody]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString; returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"%@", returnString);