Multipart / Formdata图片上传,获取文件

在我的应用程序中,我想上传一个通过UIImagePickerControllerselect的图像到只接受JPEG图像的数据库。 我在这里浏览了许多问题,在其他论坛上,但我仍然没有得到它的工作。 我希望你能检查我的代码,如果有一个我看不见的错误。 这是上传的完整方法,包含图片说明,图片标题和此图片的地理数据:

 - (void) uploadPic{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *destinationFilePath = [[NSString alloc] initWithFormat: @"%@/%@.jpeg", documentsDirectory, self.chosenImage.imgTitle]; NSURL *fileURL = [[NSURL alloc]initWithString:destinationFilePath]; NSLog(@"will upload file: %@", destinationFilePath); NSData *imageURLdata = [[NSData alloc]initWithContentsOfURL:fileURL]; (*1) NSData *imageData = UIImageJPEGRepresentation(self.chosenImage, 90); (*2) //Here i tried 2 ways of getting the data for uploading, but both don't work. // create the URL NSURL *postURL = [NSURL URLWithString:@"http://*********/PictureUpload"]; // create the connection NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:postURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0]; // change type to POST (default is GET) [postRequest setHTTPMethod:@"POST"]; // just some random text that will never occur in the body NSString *stringBoundary = @"0xKhTmLbOuNdArY---This_Is_ThE_BoUnDaRyy---pqo"; // header value, user session ID added NSString *headerBoundary = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", sessionID]; // set header [postRequest addValue:headerBoundary forHTTPHeaderField:@"Content-Type"]; // create data NSMutableData *postBody = [NSMutableData data]; // title part [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"title\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[self.chosenImage.imgTitle dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // desc part [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"desc\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[self.chosenImage.imgDescription dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // latitude part [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"latitude\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[self.chosenImage.latitude dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // longitude part [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"longitude\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[self.chosenImage.longitude dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // media part [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@.jpeg\"\r\n", self.chosenImage.imgTitle ] dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[@"Content-Type: image/jpeg\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [postBody appendData:[NSData dataWithData:imageURLdata]]; [postBody appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // final boundary [postBody appendData:[[NSString stringWithFormat:@"--%@--\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; NSString *s = [[NSString alloc] initWithData:postBody encoding:NSASCIIStringEncoding]; NSLog(@"%@", s); // add body to post [postRequest setHTTPBody:postBody]; // pointers to some necessary objects NSURLResponse* response; NSError* error; // synchronous filling of data from HTTP POST response NSData *responseData = [NSURLConnection sendSynchronousRequest:postRequest returningResponse:&response error:&error]; if (error) { NSLog(@"Error: %@", [error localizedDescription]); } // convert data into string NSString *responseString = [[NSString alloc] initWithBytes:[responseData bytes] length:[responseData length] encoding:NSUTF8StringEncoding]; // see if we get a welcome result NSLog(@"%@", responseString); [self responseHandler:responseString]; } 

GEOimage中selectUIImage之后, GEOimage chosenImage是通过chosenImage创build的。 方法nr。 * 1来获取上传的NSData不是最好的,因为这里的图像是从文档目录中select的,这里每一个关于图像的EXIF信息都被删除。 使用这两种方法我从数据库得到的响应不支持图像文件types(JPEG预期)。 我用方法nr思考。 * 2我发送一个JPEG图像,但也许我在整个multipart / formdata过程中有一个错误。

我试图让URL到文件系统上的原始文件,但这对我来说是相当困难的。 我只从图像中获得了资源-URL。

提前致谢

S4lfish

你现在可能已经自己解决了,但是我想我看到了你的问题。

 NSString *stringBoundary = @"0xKhTmLbOuNdArY---This_Is_ThE_BoUnDaRyy---pqo"; // header value, user session ID added NSString *headerBoundary = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", sessionID]; 

当您在MIME头部中定义边界时,您将使用sessionID作为边界。 然后,在下面,你使用你的stringBoundaryvariables来创build实际的边界。

 [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

提供每个MIME块的Content-Length来帮助处理代码也可能是一个好主意,但我不认为这是问题。

//试试这个—- >>>

  NSMutableDictionary *post_dic=[[NSMutableDictionary alloc]initWithCapacity:20]; [post_dic setObject:firstName_txtFld.text forKey:@"firstname"]; [post_dic setObject:lastName_txtFld.text forKey:@"lastname"]; [post_dic setObject:email_txtFld.text forKey:@"email"]; [post_dic setObject:password_txtFld.text forKey:@"password"]; [post_dic setObject:country_txtFld.text forKey:@"address"]; [post_dic setObject:state_txtFld.text forKey:@"state"]; [post_dic setObject:city_txtFld.text forKey:@"city"]; [post_dic setObject:zip_txtFld.text forKey:@"zip"]; [post_dic setObject:phoneNumber_txtFld.text forKey:@"phonenumber"]; NSURL *url = [NSURL URLWithString:@"Enter your url"]; NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; [urlRequest setHTTPMethod:@"POST"]; [urlRequest setHTTPBody:[urlString dataUsingEncoding:NSUTF8StringEncoding]]; NSString *boundary = @"--------------------------14737809831466499882746641449"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [urlRequest addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSMutableData *postbody = [NSMutableData data]; for (NSString *param in post_dic) { [postbody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[[NSString stringWithFormat:@"%@\r\n", [post_dic objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]]; } [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"filedata\"; filename=\"%@.jpg\"\r\n",@"text"] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; //NSLog(@" image -->%@",imageData); [postbody appendData:[NSData dataWithData:imageData]]; [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [urlRequest setHTTPBody:postbody]; [urlRequest setURL:url]; NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; [connection start];