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.
- La dépendance `AFNetworking (~> 2.5)` n'est utilisée dans aucune cible concrète
- AFNetwork 2.0 File d'attente avec bloc d'achèvement?
- PHAsset + AFNetworking. Impossible de download des files sur le server sur un périphérique réel
- AFNetworking 2.0 download plusieurs images avec l'achèvement
- Passer de http à https. Certificat invalide
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.
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.
[request setHTTPBody:body];
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 .
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.