ios使用HTTP POST上传图片和文字
谢谢阅读。
我是iOS的新手,我尝试在iOS中使用multi-part form encoding
上传图像和文本。
curl
等价物是这样的: curl -F "param1=value1" -F "param2=@testimage.jpg" " http://some.ip.address:5000/upload "
上面的curl
命令在JSON.
返回预期的正确响应JSON.
问题:我不断收到HTTP 400请求,这意味着我在编写HTTP POST正文时出错。
我做了什么:对于一些参考,我试图Flickr API iOS应用程序“POST大小太大!” 和Objective C:如何使用HTTP POST上传图片和文字? 。 但是,我一直在得到一个HTTP 400。
我尝试了ASIHttpRequest
但在那里有一个不同的问题(callback从来没有被称为)。 但是,我没有进一步调查,因为我听说开发者已经停止支持图书馆: http : //allseeing-i.com/[request_release] ;
有人能帮我吗?
这里是我的应用程序的代码发布图像到我们的networking服务器:
// 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];
XJones的回答很有魅力。
但他没有提及/声明variables_params
, BoundaryConstant
和requestURL
。 所以,我想把这个部分作为他的职位的附加部分,以便将来可以帮助其他人。
// 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:@""];
正如我刚才提到的那样,这本身并不是一个答案,只是XJones职位的插件。
用于通过post方法发送http post image和用户名和密码
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); //
使用AFNetworking; 将其他参数放在参数字典中,并将图像数据附加到表单数据中。
//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; } }
这是我的类似的networking套件库上传文件的多部分forms:
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:@"Drama" 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];
使用委托通知关于上传进度。
使用notificationName来通知请求何时完成。
使用队列将此请求添加到您的操作队列中,以便在正确的时间处理它。
这里是由@xjones提供的代码翻译的工作的swift代码。 非常感谢你的帮助伴侣。 你的唯一方法就是为我工作。 我用这个方法发送1个图像和另一个参数到asp.net中的web服务
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.sharedSession().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()
这是一个Swift版本。 请注意,如果您不想发送表单数据,发送空的表单边界仍然很重要。 Flask特别期望表单数据,后面是文件数据,不会填充request.files
而没有第一个边界。
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")
在Swift 2.2中使用NSURLConnection类上传具有表单数据的图像:
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) } } }
注意:总是使用sendAsynchronousRequest
方法而不是sendSynchronousRequest
来上传/下载数据,以避免阻塞主线程。 这里我只使用sendSynchronousRequest来进行testing。
我可以向你展示一个使用NSMutableURLRequest
和NSURLSessionUploadTask
在php脚本的帮助下将.txtfile upload到服务器的例子。
-(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]; }
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; }