ios Subir image y text usando HTTP POST

Gracias por leer.

Soy nuevo en iOS y estoy intentando upload una image y un text usando la multi-part form encoding en iOS.

El curl equivalente es algo así: curl -F "param1=value1" -F "param2=@testimage.jpg" " http://some.ip.address:5000/upload "

El command curl anterior devuelve la respuesta correcta esperada en JSON.

Problema: Sigo recibiendo una request de HTTP 400, lo que significa que estoy haciendo algo mal al componer el cuerpo de HTTP POST.

Lo que hice: Para alguna reference, probé la aplicación Flickr API iOS "¡Tamaño POST demasiado grande!" y el objective C: ¿Cómo cargar imágenes y texts usando HTTP POST? . Pero sigo obteniendo un HTTP 400.

ASIHttpRequest el ASIHttpRequest pero tuve un problema diferente allí (la callback nunca fue llamada). Pero, no investigé más sobre eso, ya que escuché que el desarrollador dejó de apoyar a la biblioteca: http://allseeing-i.com/[request_release] ;

¿Podría alguien ayudarme?

    Aquí está el código de mi aplicación para publicar una image en nuestro server web:

     // 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]; 

    La respuesta de XJones funcionó como encanto.

    Pero él no mencionó / ​​declaró variables _params , BoundaryConstant y requestURL . Por lo tanto, pensé publicar esa parte como complemento de su publicación, para que pueda ayudar a otros en el futuro.

     // 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:@""]; 

    Como mencioné earler, esta no es una respuesta en sí misma, solo un complemento para la publicación de XJones .

    Para la image de la publicación http y el nombre de usuario y la contraseña que se envían mediante el método de publicación

      NSString *str=[NSString stringWithFormat:@"%@registration.php",appdel.baseUrl]; NSString *urlString = [NSString stringWithFormat:@"%@",str]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSMutableData *body = [NSMutableData data]; NSString *boundary = @"---------------------------14737809831466499882746641449"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"a.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:imgData]]; [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // parameter username [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"username\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[userName.text dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // parameter token [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"email\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[eMail.text dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // parameter method [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"pass\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[passWord.text dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; //parameter method NSLog(@"%@",countryCode); [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"country\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[countryCode dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // close form [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // setting the body of the post to the reqeust [request setHTTPBody:body]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; // NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableLeaves error:nil]; Nslog(@"%@",dict); // 

    Use AFNetworking; Coloque otros parameters en el dictionary de parameters y anexe los datos de la image en los datos del formulario.

     //Upload Image Using AFNetworking -(BOOL)uploadImageAFNetworkingWithURL:(NSString *)path andImage:(UIImage *)image andImageNameWithExtension:(NSString *)strImageName andParamDict:(NSDictionary *)dictParam andKeyForUploadingImage:(NSString *)keyUplaodImg{ NSData *imageData = UIImageJPEGRepresentation(image, 0.5); NSString *strError = EMPTY_STRING; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.requestSerializer = [AFJSONRequestSerializer serializer]; [manager POST:path parameters:dictParam constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileData:imageData name:keyUplaodImg fileName:strImageName mimeType:@"image/jpeg"]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"success = %@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error = %@", error); NSLog(@"Response = %@", operation); [strError stringByAppendingString:STR_ERR_MESSAGE]; }]; if(strError.length>0){ return NO; }else{ return YES; } } 

    Aquí está mi biblioteca de kit de networking similar para cargar files como forma multiparte:

     WebRequest *request = [[WebRequest alloc] initWithPath:@"...documents/create.json"]; // optional attributes request.delegate = delegate; request.notificationName = @"NotificationDocumentUploaded"; request.queue = myQueue; NSMutableData *body = [NSMutableData data]; NSString *boundary = @"TeslaSchoolProjectFormBoundary"; [body appendPartName:@"document[name]" value:@"Test" boundary:boundary]; [body appendPartName:@"document[description]" value:@"This is a description" boundary:boundary]; [body appendPartName:@"document[category]" value:@"Dtwig" boundary:boundary]; ... [body appendPartName:@"commit" value:@"Save" boundary:boundary]; NSData *fileData = [[NSData alloc] initWithContentsOfURL:someFileURL]; [body appendPartFile:fileName name:@"document[file]" data:fileData mimeType:mimeType boundary:boundary]; [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:body]; NSString *bodyLength = [NSString stringWithFormat:@"%lu",(unsigned long)[body length]]; [request addValue:bodyLength forHTTPHeaderField:@"Content-Length"]; [request setValue:[NSString stringWithFormat:@"multipart/form-data; charset=utf-8; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"]; // optional values [request addValue:@"gzip,deflate,sdch" forHTTPHeaderField:@"Accept-Encoding"]; [request addValue:@"max-age=0" forHTTPHeaderField:@"Cache-Control"]; [request addValue:@"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" forHTTPHeaderField:@"Accept"]; [request addValue:@"en-US,en;q=0.8,hr;q=0.6,it;q=0.4,sk;q=0.2,sl;q=0.2,sr;q=0.2" forHTTPHeaderField:@"Accept-Language"]; [request setHTTPMethod:@"POST"]; [WebRequestProcessor process:request]; 

    Use el delegado para notificar sobre la carga del progreso.

    Use el nombre de notificación para notificar cuándo finalizó la request.

    Use la queue para agregar esta request a su queue de operaciones para que se procese en el momento adecuado.

    aquí está el código rápido de trabajo traducido del código provisto por @xjones. Muchas gracias por tu compañero de ayuda. La tuya fue la única manera que funcionó para mí. Utilicé este método para enviar 1 image y otro parámetro a un service web realizado en asp.net


      let params = NSMutableDictionary() let boundaryConstant = "----------V2y2HFg03eptjbaKO0j1" let file1ParamConstant = "file1" params.setObject(device_id!, forKey: "deviceID") let requestUrl = NSURL(string: "\(siteurl):\(port)/FileUpload/Upload") let request = NSMutableURLRequest() request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData request.HTTPShouldHandleCookies=false request.timeoutInterval = 30 request.HTTPMethod = "POST" let contentType = "multipart/form-data; boundary=\(boundaryConstant)" request.setValue(contentType, forHTTPHeaderField: "Content-Type") let body = NSMutableData() // parameters for param in params { body.appendData("--\(boundaryConstant)\r\n" .dataUsingEncoding(NSUTF8StringEncoding)! ) body.appendData("Content-Disposition: form-data; name=\"\(param)\"\r\n\r\n" .dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData("\(param.value)\r\n" .dataUsingEncoding(NSUTF8StringEncoding)!) } // images // image begin body.appendData("--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData("Content-Disposition: form-data; name=\"\(file1ParamConstant)\"; filename=\"image.jpg\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData("Content-Type: image/jpeg\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData(passportImageData) body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) // image end body.appendData("--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) request.HTTPBody = body let postLength = "\(body.length)" request.setValue(postLength, forHTTPHeaderField: "Content-Length") request.URL = requestUrl var serverResponse = NSString() let task = NSURLSession.shanetworkingSession().dataTaskWithRequest(request) { data, response, error in if error != nil { print("error=\(error)") return } print("response = \(response)") let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) print("responseString = \(responseString!)") serverResponse = responseString! } task.resume() 

    Aquí hay una versión Swift. Tenga en count que si no desea enviar datos de formulario, es importante enviar el límite de formulario vacío. El matraz, en particular, espera datos de formulario seguidos de datos de file y no llenará request.files sin el primer límite.

      let composedData = NSMutableData() // Set content type header let BoundaryConstant = "--------------------------3d74a90a3bfb8696" let contentType = "multipart/form-data; boundary=\(BoundaryConstant)" request.setValue(contentType, forHTTPHeaderField: "Content-Type") // Empty form boundary composedData.appendData("--\(BoundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) // Build multipart form to send image composedData.appendData("--\(BoundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) composedData.appendData("Content-Disposition: form-data; name=\"file\"; filename=\"image.jpg\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) composedData.appendData("Content-Type: image/jpeg\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) composedData.appendData(rawData!) composedData.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) composedData.appendData("--\(BoundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) request.HTTPBody = composedData // Get content length let length = "\(composedData.length)" request.setValue(length, forHTTPHeaderField: "Content-Length") 

    Cargue la image con datos de formulario utilizando la class NSURLConnection en Swift 2.2 :

      func uploadImage(){ let imageData = UIImagePNGRepresentation(UIImage(named: "dexter.jpg")!) if imageData != nil{ let str = "https://staging.mywebsite.com/V2.9/uploadfile" let request = NSMutableURLRequest(URL: NSURL(string:str)!) request.HTTPMethod = "POST" let boundary = NSString(format: "---------------------------14737809831466499882746641449") let contentType = NSString(format: "multipart/form-data; boundary=%@",boundary) request.addValue(contentType as String, forHTTPHeaderField: "Content-Type") let body = NSMutableData() // append image data to body body.appendData(NSString(format: "\r\n--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData(NSString(format:"Content-Disposition: form-data; name=\"file\"; filename=\"img.jpg\"\\r\n").dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData(NSString(format: "Content-Type: application/octet-stream\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData(imageData!) body.appendData(NSString(format: "\r\n--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!) request.HTTPBody = body do { let returnData = try NSURLConnection.sendSynchronousRequest(request, returningResponse: nil) let returnString = NSString(data: returnData, encoding: NSUTF8StringEncoding) print("returnString = \(returnString!)") } catch let error as NSError { print(error.description) } } } 

    Nota: Siempre use el método sendAsynchronousRequest lugar de sendSynchronousRequest para cargar / download datos para evitar bloquear el hilo principal. Aquí utilicé sendSynchronousRequest para fines de testing solamente.

    Puedo mostrarle un ejemplo de upload un file .txt a un server con NSMutableURLRequest y NSURLSessionUploadTask con la ayuda de un script php .

     -(void)uploadFileToServer : (NSString *) filePath { NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://YourURL.com/YourphpScript.php"]]; [request setHTTPMethod:@"POST"]; [request addValue:@"File Name" forHTTPHeaderField:@"FileName"]; NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject]; NSURLSessionUploadTask* uploadTask = [defaultSession uploadTaskWithRequest:request fromFile:[NSURL URLWithString:filePath] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; if (error || [httpResponse statusCode]!=202) { //Error } else { //Success } [defaultSession invalidateAndCancel]; }]; [uploadTask resume]; } 

    script php

     <?php $request_body = @file_get_contents('php://input'); foreach (getallheaders() as $name => $value) { if ($FileName=="FileName") { $header=$value; break; } } $uploadedDir = "directory/"; @mkdir($uploadedDir); file_put_contents($uploadedDir."/".$FileName.".txt", $request_body.PHP_EOL, FILE_APPEND); header('X-PHP-Response-Code: 202', true, 202); ?> 
     use below code. it will work fine for me. +(void) sendHttpRequestWithArrayContent:(NSMutableArray *) array ToUrl:(NSString *) strUrl withHttpMethod:(NSString *) strMethod withBlock:(dictionary)block { if (![Utility isConnectionAvailableWithAlert:TRUE]) { [Utility showAlertWithTitle:@"" andMessage:@"No internet connection available"]; } NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init] ; [request setURL:[NSURL URLWithString:strUrl]]; [request setTimeoutInterval:120.0]; [request setHTTPMethod:strMethod]; NSString *boundary = @"---------------------------14737809831466499882746641449"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSMutableData *body=[[NSMutableData alloc]init]; for (NSMutableDictionary *dict in array) { if ([[dict valueForKey:[[dict allKeys]objectAtIndex:0]] isKindOfClass:[NSString class]]) { [body appendData:[self contentDataFormStringWithValue:[dict valueForKey:[[dict allKeys]objectAtIndex:0]] withKey:[[dict allKeys]objectAtIndex:0]]]; } else if ([[dict valueForKey:[[dict allKeys]objectAtIndex:0]] isKindOfClass:[UIImage class]]) { [body appendData:[self contentDataFormImage:[dict valueForKey:[[dict allKeys]objectAtIndex:0]] withKey:[[dict allKeys]objectAtIndex:0]]]; } else if ([[dict valueForKey:[[dict allKeys]objectAtIndex:0]] isKindOfClass:[NSMutableDictionary class]]) { [body appendData:[self contentDataFormStringWithValue:[dict valueForKey:[[dict allKeys]objectAtIndex:0]] withKey:[[dict allKeys]objectAtIndex:0]]]; } else { NSMutableData *dataBody = [NSMutableData data]; [dataBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [dataBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"ipodfile.jpg\"\r\n",@"image"] dataUsingEncoding:NSUTF8StringEncoding]]; [dataBody appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [dataBody appendData:[dict valueForKey:[[dict allKeys]objectAtIndex:0]]]; [body appendData:dataBody]; } } [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:body]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if (!data) { NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setObject:[NSString stringWithFormat:@"%@",SomethingWentWrong] forKey:@"error"]; block(dict); return ; } NSError *error = nil; // NSString *str=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; NSLog(@"%@",dict); if (!dict) { NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setObject:ServerResponceError forKey:@"error"]; block(dict); return ; } block(dict); }]; } +(NSMutableData*) contentDataFormStringWithValue:(NSString*)strValue withKey:(NSString *) key { NSString *boundary = @"---------------------------14737809831466499882746641449"; NSMutableData *data=[[NSMutableData alloc]init]; [data appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [data appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key] dataUsingEncoding:NSUTF8StringEncoding]]; [data appendData:[[NSString stringWithFormat:@"%@",strValue] dataUsingEncoding:NSUTF8StringEncoding]]; // title return data; } +(NSMutableData*) contentDataFormImage:(UIImage*)image withKey: (NSString *) key { NSString *boundary = @"---------------------------14737809831466499882746641449"; NSMutableData *body = [NSMutableData data]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"ipodfile.jpg\"\r\n",key] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; NSData *imageData=UIImageJPEGRepresentation(image, 0.40); [body appendData:imageData]; return body; }