Téléchargement de l'image sur le server Explication détaillée pour le débutant

Je travaille sur le téléchargement d'une image sur un server des deux derniers jours car il y a des tonnes de questions sur le téléchargement d'une image via AFNetworking et NSURLSession et d'autres methods de téléchargement. Je n'ai pas trouvé de réponse unique expliquant Tout le concept sur la façon dont les choses fonctionnent et ce qui se passe sous le capot J'ai cherché youtube aussi tous les trucs sont disponibles dans Swift et croyez-moi pas d'explication du tout et de mon résultat, j'ai trouvé cette réponse me semble familier



//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 URLWithSsortingng:@"yourURL"]; NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; //Create POST Params and add it to HTTPBody NSSsortingng *params = @"api_key=APIKEY&[email protected]&password=password"; [urlRequest setHTTPMethod:@"POST"]; [urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8SsortingngEncoding]]; //Create task NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { //Handle your response here }]; [dataTask resume]; 


et aussi la réponse la plus populaire sur ce sujet est par l'user XJones est: –

 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:[NSSsortingng ssortingngWithSsortingng:@"1.0"] forKey:[NSSsortingng ssortingngWithSsortingng:@"ver"]]; [_params setObject:[NSSsortingng ssortingngWithSsortingng:@"en"] forKey:[NSSsortingng ssortingngWithSsortingng:@"lan"]]; [_params setObject:[NSSsortingng ssortingngWithFormat:@"%d", userId] forKey:[NSSsortingng ssortingngWithSsortingng:@"userId"]]; [_params setObject:[NSSsortingng ssortingngWithFormat:@"%@",title] forKey:[NSSsortingng ssortingngWithSsortingng:@"title"]]; // the boundary ssortingng : a random ssortingng, that will not repeat in post data, to separate post data fields. NSSsortingng *BoundaryConstant = [NSSsortingng ssortingngWithSsortingng:@"----------V2ymHFg03ehbqgZCaKO6jy"]; // ssortingng constant for the post parameter 'file'. My server uses this name: `file`. Your's may differ NSSsortingng* FileParamConstant = [NSSsortingng ssortingngWithSsortingng:@"file"]; // the server url to which the image (or the media) is uploaded. Use your server url here NSURL* requestURL = [NSURL URLWithSsortingng:@""]; // 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 NSSsortingng *contentType = [NSSsortingng ssortingngWithFormat:@"multipart/form-data; boundary=%@", BoundaryConstant]; [request setValue:contentType forHTTPHeaderField: @"Content-Type"]; // post body NSMutableData *body = [NSMutableData data]; // add params (all params are ssortingngs) for (NSSsortingng *param in _params) { [body appendData:[[NSSsortingng ssortingngWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"%@\r\n", [_params objectForKey:param]] dataUsingEncoding:NSUTF8SsortingngEncoding]]; } // add image data NSData *imageData = UIImageJPEGRepresentation(imageToPost, 1.0); if (imageData) { [body appendData:[[NSSsortingng ssortingngWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", FileParamConstant] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithSsortingng:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:imageData]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8SsortingngEncoding]]; } [body appendData:[[NSSsortingng ssortingngWithFormat:@"--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8SsortingngEncoding]]; // setting the body of the post to the reqeust [request setHTTPBody:body]; // set the content-length NSSsortingng *postLength = [NSSsortingng ssortingngWithFormat:@"%d", [body length]]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; // set URL [request setURL:requestURL]; 


Mais ce que je veux dire c'est que j'apprends tout seul et qu'il est très difficile à comprendre pour le débutant sans explication. Tout ce que je request c'est une explication, une explication détaillée de tout le process si quelqu'un a du mal à le faire. question parce que croyez-le ou pas, j'ai trouvé ce sujet le plus difficile jusqu'à maintenant parce que la raison principale est qu'il n'y a pas de tutoriels sur tout le process et aussi aucune explication pour les débutants si quelqu'un peut faire un pas maintenant et expliquer le concept ça va être plus facile aux étudiants qui apprendront demain. Donc, toute personne qui peut expliquer cela en détail et comment le process de téléchargement fonctionne et quelques étapes pour la reference seront grandement appréciées.

Remarque : Considérez que j'ai une API et une "image" key.

Ici, nous allons regarder le téléchargement d'images avec quelques parameters ** parce que la plupart du time, nous téléchargeons l'image avec certains parameters tels que userId.

  • Avant d'aller plus loin dans notre sujet permettez-moi de fournir le code pour faire la source , Tous les détails que nous verrons ci-dessous proviennent d'autres threads de débordement de stack et certains d'autres sites, je fournirai tous les liens pour votre 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 NSSsortingng *boundary = @"------CLABoundaryGOKUL"; //3 NSSsortingng *contentType = [NSSsortingng ssortingngWithFormat:@"multipart/form-data; boundary=%@", boundary]; [request setValue:contentType forHTTPHeaderField: @"Content-Type"]; //4 NSMutableData *body = [NSMutableData data]; for (NSSsortingng *key in inputParameter) { [body appendData:[[NSSsortingng ssortingngWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"%@\r\n", [inputParameter objectForKey:key]] dataUsingEncoding:NSUTF8SsortingngEncoding]]; } for (int i = 0; i < image.count; i++) { NSData *imageDatasss = UIImagePNGRepresentation(image[i]); if (imageDatasss) { [body appendData:[[NSSsortingng ssortingngWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", FileParamConstant[i]] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[@"Content-Type:image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:imageDatasss]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8SsortingngEncoding]]; } } [body appendData:[[NSSsortingng ssortingngWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8SsortingngEncoding]]; //5 [request setHTTPBody:body]; //6 [request setURL:[NSURL URLWithSsortingng:@"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); } }]; } 

    NOTE: Puisque c'est un sujet général j'ai fourni le lien de documentation pour l'information de détail.

    1. Nous utilisons ** NSMutableURLRequest ** au lieu de ** NSURLRequest ** parce que nous allons y append des données. Si vous avez besoin d'une clarification approfondie de la requête de l'URL modifiable, consultez cette documentation .
      • setHTTPShouldHandleCookies ici nous devons décider si nous allons utiliser des cookies ou non.Pour en savoir plus sur la visite
      • setTimeoutInterval cela permet de définir une limite de time à la request d'url. Ajouter un intervalle de time en secondes après l'heure donnée, la requête sera terminée.
      • setHTTPMethod il existe de nombreuses methods. Mais nous utilisons les methods GET et POST dans de nombreux cas. La différence entre POST et GET est ici et ici
    2. La limite aide à séparer les parameters les uns des autres, de sorte que le server puisse les identifier. La limite peut être n'importe quoi que votre souhait hésitez à le modifier.
    3. Ici, nous utilisons multipart / form-data; boundary = comme type de contenu.Pour savoir pourquoi nous allons à ce type de contenu regardez dans ce fil.
    4. Corps NSMutableData * nous allons append tous les parameters et les valeurs à ces données et plus tard setHTTPBody à l' UrlRequest .

      • Si c'est ainsi que nous appelons la méthode '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]; } 
      • alors datatables (c.-à-corps) ressembleront à ceci

 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. 
  • Les données ci-dessus expliquent clairement ce qui se passe, tous les parameters et keys ont été ajoutés dans datatables. Vous findez ici plus de détails sur l'envoi de multipart / formulaire.

    1. Maintenant, ajoutez simplement datatables ci-dessus à la request de [request setHTTPBody:body];
    2. setURL dans cette méthode ajoute votre URL de base de votre application.
    3. Maintenant tout ce que nous devons faire est de faire une connection au server et d'envoyer la requête. Ici, nous utilisons NSURLConnection pour envoyer une requête. Description à propos de NSURLConnection Charge datatables pour une requête d'URL et exécute un bloc gestionnaire sur une queue d'opérations lorsque la requête est terminée ou échoue.
    4. statusCode qui aide à savoir si nous avons eu une réponse positive du server. Si 200 signifie OK, 500 signifie Erreur server interne, etc. plus de détails ici .

    5. Gérer l'erreur dans un autre cas.

Pour info, j'ai expliqué ce que je peux, renvoyer les liens pour une meilleure compréhension.

MODIFIER:

Il suffit de changer le nom dans le tableau imageParamater , Pour satisfaire votre exigence changé img_one & img_two avec l' 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]; } 

et Changez le point 6 avec l'URL de votre exemple,

// 6

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

Je pense que c'est utile pour vous …

 - (void)sendImageToServer { UIImage *yourImage= [UIImage imageNamed:@"image.png"]; NSData *imageData = UIImagePNGRepresentation(yourImage); NSSsortingng *base64 = [imageData base64EncodedSsortingngWithOptions:NSDataBase64Encoding64CharacterLineLength]; NSSsortingng *strImage = [NSSsortingng ssortingngWithFormat:@"data:image/png;base64,%@",base64]; NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:strImage,@"image", nil]; NSError * err; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:&err]; NSSsortingng *UserProfileInRequest = [[NSSsortingng alloc] initWithData:jsonData encoding:NSUTF8SsortingngEncoding]; NSData *data=[UserProfileInRequest dataUsingEncoding:NSASCIISsortingngEncoding allowLossyConversion:YES]; NSSsortingng *len = [NSSsortingng ssortingngWithFormat:@"%ld", (unsigned long)[data length]]; // Init the URLRequest NSMutableURLRequest *req = [[NSMutableURLRequest alloc] init]; [req setURL:[NSURL URLWithSsortingng:@"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 sharedSession]; [[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]; } 

Utilisez AFNetworking Pour cette tâche qui donnera une solution très facile et fiable.