Subir imagen al servidor PHP desde iOS

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

Quiero subir una imagen al servidor PHP y quiero enviar más parámetros junto con una imagen de un iOS. Busqué en Google y encontré dos soluciones:

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

  2. O cargaremos una imagen al servidor usando datos de formulario. He referido este enlace . Si alguien me refiere de esta manera, entonces ayúdame a agregar más parámetros en esta API.

Ahora mi pregunta es, cuál es la mejor manera de subir una imagen al servidor y tengo que enviar más parámetros (nombre de usuario, contraseña y más detalles) en la misma llamada de servicio web.

Gracias por adelantado.

Puede cargar imágenes desde la aplicación iOS al PHP server esta manera:

Usando New AFNetworking :

 #import "AFHTTPRequestOperation.h" #import "AFHTTPRequestOperationManager.h" NSString *stringUrl =@"http://www.myserverurl.com/file/uloaddetails.php?" NSString *string =@"http://sofes.miximages.com/ios/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 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 subir imágenes de la aplicación al servidor php espero que esto ayude para usted.

Usando AFNetworking, así es como lo hago:

 NSMutableDictionary *params = [[NSMutableDictionary alloc]init]; [params setObject:@"myUserName" forKey:@"username"]; [params setObject:@"1234" forKey:@"password"]; [[AFHTTPRequestOperationLogger sharedLogger] 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 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á el enlace Carga de la imagen de Restkit con parámetro

Puedes obtener 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 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];