Cargar image al server Detalle Explicación para principiantes

Estoy trabajando en upload una image a un server de los últimos dos días, ya que hay toneladas de preguntas sobre la carga de una image a través de AFNetworking y NSURLSession y otros methods de cargar todo lo que estoy preguntando es que no encontré una sola respuesta explicando el todo el concepto sobre cómo funcionan las cosas y lo que está sucediendo bajo el capó busqué en YouTube también todas las cosas están disponibles en Swift y confía en mí no Explicación en absoluto y de mi resultado encontré esta respuesta es algo que me resulta familiar



//Init the NSURLSession with a configuration NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]]; //Create an URLRequest NSURL *url = [NSURL URLWithString:@"yourURL"]; NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; //Create POST Params and add it to HTTPBody NSString *params = @"api_key=APIKEY&email=example@example.com&password=password"; [urlRequest setHTTPMethod:@"POST"]; [urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]]; //Create task NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { //Handle your response here }]; [dataTask resume]; 


y también la respuesta más popular sobre este tema es que el usuario XJones es:

 Here's code from my app to post an image to our web server: // Dictionary that holds post parameters. You can set your post parameters that your server accepts or programmed to accept. NSMutableDictionary* _params = [[NSMutableDictionary alloc] init]; [_params setObject:[NSString stringWithString:@"1.0"] forKey:[NSString stringWithString:@"ver"]]; [_params setObject:[NSString stringWithString:@"en"] forKey:[NSString stringWithString:@"lan"]]; [_params setObject:[NSString stringWithFormat:@"%d", userId] forKey:[NSString stringWithString:@"userId"]]; [_params setObject:[NSString stringWithFormat:@"%@",title] forKey:[NSString stringWithString:@"title"]]; // the boundary string : a random string, that will not repeat in post data, to separate post data fields. NSString *BoundaryConstant = [NSString stringWithString:@"----------V2ymHFg03ehbqgZCaKO6jy"]; // string constant for the post parameter 'file'. My server uses this name: `file`. Your's may differ NSString* FileParamConstant = [NSString stringWithString:@"file"]; // the server url to which the image (or the media) is uploaded. Use your server url here NSURL* requestURL = [NSURL URLWithString:@""]; // create request NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; [request setHTTPShouldHandleCookies:NO]; [request setTimeoutInterval:30]; [request setHTTPMethod:@"POST"]; // set Content-Type in HTTP header NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", BoundaryConstant]; [request setValue:contentType forHTTPHeaderField: @"Content-Type"]; // post body NSMutableData *body = [NSMutableData data]; // add params (all params are strings) for (NSString *param in _params) { [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"%@\r\n", [_params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]]; } // add image data NSData *imageData = UIImageJPEGRepresentation(imageToPost, 1.0); if (imageData) { [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:imageData]; [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; } [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]]; // setting the body of the post to the reqeust [request setHTTPBody:body]; // set the content-length NSString *postLength = [NSString stringWithFormat:@"%d", [body length]]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; // set URL [request setURL:requestURL]; 


Pero mi punto es que estoy aprendiendo por mi count y es muy difícil de entender para el principiante sin explicación, así que todo lo que pido es una explicación, una explicación detallada sobre el process completo si alguien tiene dificultades para gastar en esto pregunta porque lo creas o no, encontré este es el tema más difícil hasta ahora porque la razón principal es que no hay tutoriales sobre todo el process y tampoco hay ninguna explicación para los principiantes si alguien puede dar un paso y explicar el concepto será más fácil a los estudiantes que aprenderán mañana. Entonces, cualquiera que pueda explicar esto en detalle y cómo funciona el process de carga y algunos pasos para la reference, será muy apreciado.

Nota : Considere que tengo una API y una "image" key.

aquí veremos la carga de imágenes junto con algunos parameters ** porque la mayoría de las veces cargamos la image junto con algunos parameters como userId.

  • Antes de profundizar en nuestro tema permítame proporcionarle el código para hacer la fuente de la materia, todos los detalles que veremos a continuación son de otros subprocesss de desbordamiento de stack y algunos de otros sitios, proporcionaré todos los enlaces para su reference.

     -(void)callApiWithParameters:(NSDictionary *)inputParameter images:(NSArray *)image imageParamters:(NSArray *)FileParamConstant{ //1 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setHTTPShouldHandleCookies:NO]; [request setTimeoutInterval:30]; [request setHTTPMethod:@"POST"]; //2 NSString *boundary = @"------CLABoundaryGOKUL"; //3 NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; [request setValue:contentType forHTTPHeaderField: @"Content-Type"]; //4 NSMutableData *body = [NSMutableData data]; for (NSString *key in inputParameter) { [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"%@\r\n", [inputParameter objectForKey:key]] dataUsingEncoding:NSUTF8StringEncoding]]; } for (int i = 0; i < image.count; i++) { NSData *imageDatasss = UIImagePNGRepresentation(image[i]); if (imageDatasss) { [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", FileParamConstant[i]] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type:image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:imageDatasss]; [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; } } [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; //5 [request setHTTPBody:body]; //6 [request setURL:[NSURL URLWithString:@"http://changeThisWithYourbaseURL?"]];//Eg:@"http://dev1.com/PTA_dev/webservice/webservice.php?" //7 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; //8 if ([httpResponse statusCode] == 200) { NSDictionary * APIResult =[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; NSLog(@"Response of %@: %@",[inputParameter valueForKey:@"service"],APIResult); }else{ //9 NSLog(@"%@",error.localizedDescription); } }]; } 

    NOTA: dado que es un tema amplio, he proporcionado un enlace de documentation para get información detallada.

    1. Estamos utilizando ** NSMutableURLRequest ** en lugar de ** NSURLRequest ** porque vamos a anexar algunos datos. Si necesita alguna aclaración profunda sobre la request de URL mutable, revise esta documentation .
      • setHTTPShouldHandleCookies aquí tenemos que decidir si vamos a utilizar cookies o no. Para saber más sobre la visita
      • setTimeoutInterval esto ayuda a establecer un límite de time para la request de url. Agregue el intervalo de time en segundos después del time dado, la request finalizará.
      • setHTTPMethod hay muchos methods. Pero usamos los methods GET y POST en muchos casos. La diferencia entre POST y GET está aquí y aquí.
    2. Boundary ayuda a separar los parameters entre sí, para que el server pueda identificarlos. El límite puede ser cualquier cosa que desee, puede editarlo sin problemas.
    3. Aquí utilizamos multipart / form-data; boundary = como tipo de contenido. Para saber por qué vamos a este tipo de contenido, mira este hilo.
    4. NSMutableData * cuerpo vamos a anexar todos los parameters y valores a estos datos y luego establecerHTTPBody a UrlRequest .

      • Si así es como llamamos al método 'callApiWithParameters'

          - (IBAction)Done:(id)sender{ NSDictionary * inputParameters = [NSDictionary dictionaryWithObjectsAndKeys: @"1",@"user_id" , "XXX",@"name" , nil]; NSArray * image = [NSArray arrayWithObjects:[UIImage imageNamed:@"Test"],[UIImage imageNamed:@"Test1"],nil]; NSArray * imageParameters = [NSArray arrayWithObjects:@"img_one",@"img_two",nil]; [self callApiWithParameters:inputParameters images:image imageParamters:imageParameters]; } 
      • entonces los datos (es decir, cuerpo) se verán así

 Content-Type=multipart/form-data; boundary=------CLABoundaryGOKUL --------CLABoundaryGOKUL Content-Disposition: form-data; name=user_id 1 --------CLABoundaryGOKUL Content-Disposition: form-data; name=name XXX --------CLABoundaryGOKUL Content-Disposition: form-data; name=img_one; filename=image.jpg Content-Type:image/jpeg //First image data appended here --------CLABoundaryGOKUL Content-Disposition: form-data; name=img_two; filename=image.jpg Content-Type:image/jpeg //Second image data appended here. 
  • Los datos proporcionados anteriormente explicarán claramente lo que está sucediendo, todos los parameters y keys se han agregado a los datos. Aquí puede encontrar más detalles sobre el envío de multiparte / formulario.

    1. Ahora simplemente agregue los datos anteriores a la request de [request setHTTPBody:body];
    2. setURL en este método agrega su url base de su aplicación.
    3. Ahora todo lo que necesitamos hacer es establecer una connection con el server y enviar la request. Aquí utilizamos NSURLConnection para enviar la request. Descripción sobre NSURLConnection Carga los datos para una request de URL y ejecuta un bloque de controller en una queue de operaciones cuando la request se completa o falla.
    4. statusCode que ayuda a averiguar si obtuvimos una respuesta exitosa del server. Si 200 significa OK, 500 significa Error interno del server, etc., más detalles aquí .

    5. Maneje el error en otro caso.

Para su información he explicado lo que puedo, consulte los enlaces para una mejor comprensión.

EDITAR:

Simplemente cambie el nombre en la matriz imagePatwigter , para satisfacer sus requisitos cambió img_one & img_two con image .

  - (IBAction)Done:(id)sender{ //Change input parameters as per your requirement. NSDictionary * inputParameters = [NSDictionary dictionaryWithObjectsAndKeys: @"1",@"user_id" , "XXX",@"name" , nil]; NSArray * image = [NSArray arrayWithObjects:[UIImage imageNamed:@"Test"],nil]; //Change Test with your image name NSArray * imageParameters = [NSArray arrayWithObjects:@"image",nil];//Added image as a key. [self callApiWithParameters:inputParameters images:image imageParamters:imageParameters]; } 

y cambie el punto 6 con su URL base de ejemplo,

// 6

  [request setURL:[NSURL URLWithString:@"http://google.com/files/upload.php?"]]; 

Creo que es útil para ti …

 - (void)sendImageToServer { UIImage *yourImage= [UIImage imageNamed:@"image.png"]; NSData *imageData = UIImagePNGRepresentation(yourImage); NSString *base64 = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; NSString *strImage = [NSString stringWithFormat:@"data:image/png;base64,%@",base64]; NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:strImage,@"image", nil]; NSError * err; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:&err]; NSString *UserProfileInRequest = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSData *data=[UserProfileInRequest dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *len = [NSString stringWithFormat:@"%ld", (unsigned long)[data length]]; // Init the URLRequest NSMutableURLRequest *req = [[NSMutableURLRequest alloc] init]; [req setURL:[NSURL URLWithString:@"http://YOUR_URL"]]; [req setHTTPMethod:@"POST"]; [req setValue:len forHTTPHeaderField:@"Content-Type"]; [req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [req setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [req setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [req setHTTPBody:data]; NSURLSession *session = [NSURLSession shanetworkingSession]; [[session dataTaskWithRequest:req completionHandler:^(NSData *dt, NSURLResponse *response, NSError *err){ //Response Data NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:dt options:kNilOptions error:&err]; NSLog(@"%@", [dic description]); }]resume]; } 

Use AFNetworking para esta tarea que le dará una solución muy fácil y confiable.