http POST ios (Données et Image): Image ne pas être posté

J'ai utilisé le code suivant pour PUSH une image et des données dans un server. Les données sont envoyées mais l'image n'est pas reçue sur le server. Quelqu'un peut-il me repérer s'il y a une erreur dans mon code ci-dessous que j'ai utilisé:

NSSsortingng *urlSsortingng = [[NSSsortingng alloc]initWithSsortingng:[NSSsortingng ssortingngWithFormat:@"%@action=savesign",MainURL]]; // set up the form keys and values (revise using 1 NSDictionary at some point - neater than 2 arrays) NSArray *keys = [[NSArray alloc] initWithObjects:@"user",@"poll",nil]; NSArray *vals = [[NSArray alloc] initWithObjects:user,pollid,nil]; // set up the request object NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithSsortingng:urlSsortingng]]; [request setHTTPMethod:@"POST"]; //Add content-type to Header. Need to use a ssortingng boundary for data uploading. NSSsortingng *boundary = @"0xKhTmLbOuNdArY"; NSSsortingng *contentType = [NSSsortingng ssortingngWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; //create the post body NSMutableData *body = [NSMutableData data]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSASCIISsortingngEncoding]]; //add (key,value) pairs (no idea why all the \r's and \n's are necessary ... but everyone seems to have them) for (int i=0; i<[keys count]; i++) { [body appendData:[[NSSsortingng ssortingngWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",[keys objectAtIndex:i]] dataUsingEncoding:NSASCIISsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"%@",[vals objectAtIndex:i]] dataUsingEncoding:NSASCIISsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSASCIISsortingngEncoding]]; } [body appendData:[@"Content-Disposition: form-data; name=\"image\"\r\n" dataUsingEncoding:NSASCIISsortingngEncoding]]; [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSASCIISsortingngEncoding]]; [body appendData:[NSData dataWithContentsOfFile:pngFilePath]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSASCIISsortingngEncoding]]; NSData *imageData = UIImagePNGRepresentation(_Signfield.image); [body appendData:[[NSSsortingng ssortingngWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"myPngFile.png\"\r\n", _Signfield.image] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:imageData]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8SsortingngEncoding]]; // set the body of the post to the reqeust [request setHTTPBody:body]; // make the connection to the web NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSSsortingng *returnSsortingng = [[NSSsortingng alloc] initWithData:returnData encoding:NSUTF8SsortingngEncoding]; NSLog(returnSsortingng); 

C'est la réponse du server

 {"status":"failure","error":[],"user":0} 

Et quand je me connecte et vérifie datatables sont là mais pas l'image.

Lorsque vous effectuez un téléchargement de file via HTTP POST, datatables qui sont transmises sur le fil ressemblent à ceci:

 POST /upload HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate, compress Content-Length: 17918 Content-Type: multipart/form-data; boundary=0xKhTmLbOuNdArY Host: example.com User-Agent: HTTPie/0.7.2 --0xKhTmLbOuNdArY Content-Disposition: form-data; name="user" Diphin-Das --0xKhTmLbOuNdArY Content-Disposition: form-data; name="poll" 1 --0xKhTmLbOuNdArY Content-Disposition: form-data; name="image"; filename="myPNGFile.png" Content-Type: image/png [Binary PNG image data not shown] --0xKhTmLbOuNdArY-- 

Les sept premières lignes sont les en-têtes HTTP qui décrivent la requête au server, notamment:

  • La méthode de requête HTTP ( POST )
  • La ressource demandée ( /upload )
  • La version du protocole HTTP ( HTTP/1.1 )
  • La longueur du corps de la requête ( Content-Length: 17918 )
  • Le type de données inclus dans le corps de la requête ( Content-Type: multipart/form-data; boundary=0xKhTmLbOuNdArY )

Ce dernier est intéressant. En définissant le type de contenu sur multipart/form-data , nous sums autorisés à inclure une combinaison de différents types de données dans le corps de la requête. La boundary indique au server comment chaque valeur de formulaire est séparée dans le corps de la requête.

Les valeurs de formulaire dans le corps de la requête sont décrites en utilisant une structure simple:

 --[boundary marker] Content-Disposition: form-data; name="[parameter name]" Content-Type: [parameter value MIME type] [parameter value] 

L'en-tête Content-Type est facultatif si la valeur du paramètre est alphanumérique, mais pour d'autres types de données (images, videos, documents, etc.), elle est requirejse. Le corps de fin de requête est signalé par un marqueur de limite de terminaison qui est un marqueur de délimitation standard avec un double trait d'union, par exemple --0xKhTmLbOuNdArY-- . Les caractères de nouvelle ligne (\ r \ n) sont utilisés pour délimiter les différents éléments des parties de contenu.

Il peut y avoir d'autres éléments aux valeurs de formulaire dans une requête POST en plusieurs parties. Si vous êtes intéressé, vous pouvez lire à leur sujet dans RFC 2388 .

Pour download un file à partir d'un Objective-C, vous devez créer le corps de la requête selon la spécification décrite ci-dessus. J'ai pris le code de votre question et l'ai refactorisé pour fonctionner correctement et j'ai ajouté quelques notes explicatives en cours de route.

 NSDictionary *params = @{ @"user": user, @"poll": pollid }; NSData *imageData = UIImagePNGRepresentation(_Signfield.image); NSSsortingng *urlSsortingng = [[NSSsortingng alloc]initWithSsortingng:[NSSsortingng ssortingngWithFormat:@"%@action=savesign",MainURL]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithSsortingng:urlSsortingng]]; [request setHTTPMethod:@"POST"]; NSSsortingng *boundary = @"0xKhTmLbOuNdArY"; NSSsortingng *kNewLine = @"\r\n"; // Note that setValue is used so as to override any existing Content-Type header. // addValue appends to the Content-Type header NSSsortingng *contentType = [NSSsortingng ssortingngWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request setValue:contentType forHTTPHeaderField: @"Content-Type"]; NSMutableData *body = [NSMutableData data]; // Add the parameters from the dictionary to the request body for (NSSsortingng *name in params.allKeys) { NSData *value = [[NSSsortingng ssortingngWithFormat:@"%@", params[name]] dataUsingEncoding:NSUTF8SsortingngEncoding]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"--%@%@", boundary, kNewLine] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"Content-Disposition: form-data; name=\"%@\"", name] dataUsingEncoding:NSUTF8SsortingngEncoding]]; // For simple data types, such as text or numbers, there's no need to set the content type [body appendData:[[NSSsortingng ssortingngWithFormat:@"%@%@", kNewLine, kNewLine] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:value]; [body appendData:[kNewLine dataUsingEncoding:NSUTF8SsortingngEncoding]]; } // Add the image to the request body [body appendData:[[NSSsortingng ssortingngWithFormat:@"--%@%@", boundary, kNewLine] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"myPngFile.png\"%@", @"image", kNewLine] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"Content-Type: image/png"] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:[[NSSsortingng ssortingngWithFormat:@"%@%@", kNewLine, kNewLine] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [body appendData:imageData]; [body appendData:[kNewLine dataUsingEncoding:NSUTF8SsortingngEncoding]]; // Add the terminating boundary marker to signal that we're at the end of the request body [body appendData:[[NSSsortingng ssortingngWithFormat:@"--%@--", boundary] dataUsingEncoding:NSUTF8SsortingngEncoding]]; [request setHTTPBody:body]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSSsortingng *returnSsortingng = [[NSSsortingng alloc] initWithData:returnData encoding:NSUTF8SsortingngEncoding]; NSLog(@"%@", returnSsortingng);