Cargar image al server PHP desde iOS

Sé que esta pregunta también se ha hecho antes, pero mi problema es un poco diferente.

Quiero upload una image al server PHP y quiero enviar más parameters junto con una image de un iOS. Busqué en Google y encontré dos soluciones:

  1. O enviaremos una image como cadena codificada Base64 en JSON . Enlace referido.

  2. O uploademos una image al server usando datos de formulario. Me he referido a este enlace . Si alguien me refiere de esta manera, entonces ayúdeme a agregar más parameters en esta API.

Ahora mi pregunta es, cuál es la mejor manera de cargar una image al server y tengo que enviar más parameters (nombre de usuario, contraseña y más detalles) en la misma llamada de service web.

Gracias por adelantado.

Puede cargar la image desde la aplicación iOS al PHP server esta manera:

Usando Nueva AFNetworking :

 #import "AFHTTPRequestOperation.h" #import "AFHTTPRequestOperationManager.h" NSString *stringUrl =@"http://www.myserverurl.com/file/uloaddetails.php?" NSString *string =@"http://myimageurkstrn.com/img/myimage.png" NSURL *filePath = [NSURL fileURLWithPath:string]; NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:userid,@"id",String_FullName,@"fname",String_Email,@"emailid",String_City,@"city",String_Country,@"country",String_City,@"state",String_TextView,@"bio", nil]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager POST:stringUrl parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileURL:filePath name:@"userfile" error:nil];//here userfile is a paramiter for your image } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@",[responseObject valueForKey:@"Root"]); Alert_Success_fail = [[UIAlertView alloc] initWithTitle:@"myappname" message:string delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil]; [Alert_Success_fail show]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { Alert_Success_fail = [[UIAlertView alloc] initWithTitle:@"myappname" message:[error localizedDescription] delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil]; [Alert_Success_fail show]; }]; 

Segundo uso NSURLConnection:

 -(void)uploadImage { NSData *imageData = UIImagePNGRepresentation(yourImage); NSString *urlString = [ NSString stringWithFormat:@"http://yourUploadImageURl.php?intid=%@",1]; NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"]; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSMutableData *body = [NSMutableData data]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n", 1]] 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 stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:body]; [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; } 

De esta manera, funciona bien para cargar imágenes desde la aplicación al server php. Espero que esto te sea útil.

Al usar AFNetworking, así es como lo hago:

 NSMutableDictionary *params = [[NSMutableDictionary alloc]init]; [params setObject:@"myUserName" forKey:@"username"]; [params setObject:@"1234" forKey:@"password"]; [[AFHTTPRequestOperationLogger shanetworkingLogger] startLogging]; NSData *imageData; NSString *urlStr = [NSString stringWithFormat:@"http://www.url.com"]; NSURL *url = [NSURL URLWithString:urlStr]; AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; imageData = UIImageJPEGRepresentation(mediaFile, 0.5); NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:nil parameters:params constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) { [formData appendPartWithFileData:imageData name:@"mediaFile" fileName:@"picture.png" mimeType:@"image/png"]; }]; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"File was uploaded" message:@"" delegate:self cancelButtonTitle:@"Close" otherButtonTitles: nil]; [alert show]; } failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON) { NSLog(@"request: %@",request); NSLog(@"Failed: %@",[error localizedDescription]); }]; [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite); }]; [httpClient enqueueHTTPRequestOperation:operation]; 

Prueba con Restkit

Aquí está la subida de la image del enlace Restkit con el parámetro

Puede get ayuda de Restkit desde aquí Paso de integración de Restkit

Prueba esto.

 -(void)EchoesPagePhotosUpload { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ [self startIndicator]; }); //NSLog(@"%@",uploadPhotosArray); NSMutableArray *uploadPhotosByteArray=[[NSMutableArray alloc] init]; conversionImage= [UIImage imageWithContentsOfFile:[uploadPhotosArray objectAtIndex:0]]; NSLog(@"conversionImage.size.height %f",conversionImage.size.height); NSLog(@"conversionImage.size.width %f",conversionImage.size.width); if(conversionImage.size.height>=250&&conversionImage.size.width>=250) { dispatch_async(dispatch_get_main_queue(), ^(void) { [self performSelectorInBackground: @selector(LoadForLoop) withObject: nil]; NSLog(@"conversionImage.size.height %f",conversionImage.size.height); NSLog(@"conversionImage.size.width %f",conversionImage.size.width); for(int img_pos=0;img_pos<[uploadPhotosArray count];img_pos++) { conversionImage= [UIImage imageWithContentsOfFile:[uploadPhotosArray objectAtIndex:img_pos]]; NSData *imageData = UIImageJPEGRepresentation(conversionImage,1.0); [Base64 initialize]; NSString *uploadPhotoEncodedString = [Base64 encode:imageData]; //NSLog(@"Byte Array %d : %@",img_pos,uploadPhotoEncodedString); [uploadPhotosByteArray addObject:uploadPhotoEncodedString]; } dispatch_async(dispatch_get_main_queue(), ^{ NSString *photo_description=[webview stringByEvaluatingJavaScriptFromString: @"document.getElementById('UploadPicsDesc').value"]; NSString *uploadPhotoImageName=@"uploadPhoto.jpg"; NSDictionary *UploadpicsJsonResponseDic=[WebserviceViewcontroller EchoesUploadPhotos:profileUserId imageName:uploadPhotoImageName Image:uploadPhotosByteArray PhotoDescription:photo_description]; //NSLog(@"%@",UploadpicsJsonResponseDic); NSString *UploadPhotosStatusString=[UploadpicsJsonResponseDic valueForKey:@"Status"]; NSLog(@"UploadPhotosStatusString :%@",UploadPhotosStatusString); NSString *uploadPhotosCallbackstring=[NSString stringWithFormat:@"RefreshForm()"]; [webview stringByEvaluatingJavaScriptFromString:uploadPhotosCallbackstring]; }); }); } else { UIAlertView *ErrorAlert=[[UIAlertView alloc] initWithTitle:@"Error" message:@"Please Upload Photo Above 250x250 size" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [ErrorAlert show]; NSLog(@"conversionImage.size.height %f",conversionImage.size.height); NSLog(@"conversionImage.size.width %f",conversionImage.size.width); } } 
 -(void)uploadImage { NSString *mimetype = @"image/jpeg"; NSString *myimgname = _txt_fname.text; //@"img"; //upload image with this name in server PHP FILE MANAGER NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSData *imageDataa = UIImagePNGRepresentation(chooseImg.image); NSDictionary *parameters =@{@"fileimg":defaults }; //@{@"uid": [uidstr valueForKey:@"id"]}; AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer]; //here post url and imagedataa is data conversion of image and fileimg is the upload image with that name in the php code NSMutableURLRequest *request = [serializer multipartFormRequestWithMethod:@"POST" URLString:@"http://posturl/newimageupload.php" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileData:imageDataa name:@"fileimg" fileName:myimgname mimeType:mimetype]; }]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //manager.responseSerializer = [AFHTTPResponseSerializer serializer]; AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"Success %@", responseObject); [uploadImgBtn setTitle:@"Uploaded" forState:UIControlStateNormal]; [chooseImg setImage:[UIImage imageNamed:@"invoice-icon.png"]]; if([[responseObject objectForKey:@"status"] rangeOfString:@"Success"].location != NSNotFound) { [self alertMsg:@"Alert" :@"Upload sucess"]; } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Failure %@", error.description); [chooseImg setImage:[UIImage imageNamed:@"invoice-icon.png"]]; uploadImgBtn.enabled = YES; }]; // 4. Set the progress block of the operation. [operation setUploadProgressBlock:^(NSUInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { float myprog = (float)totalBytesWritten/totalBytesExpectedToWrite*100; NSLog(@"Wrote %f ", myprog); }]; // 5. Begin! [operation start]; } 

Prueba esto, esto es trabajo para mí.

  NSData *postData = [Imagedata dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:apiString]]; [request setHTTPMethod:@"POST"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; NSURLResponse *response; NSError *err; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; NSString *responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding]; NSError *jsonError; NSData *objectData = [responseString dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *responseDictft = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&jsonError];