我需要POST一个请求。该请求有3个参数,'email_id','location'和'image_data'。 'image_data'的值包含UIImage的NSData jpeg表示。必须使用内容类型的multipart / form-data提交请求。如何创建NSMutableRequest以发布此请求?我该如何设置边界?是整个数据包所需的边界还是仅适用于图像部分?
答案 0 :(得分:2)
此链接:
http://iphone.zcentric.com/2008/08/29/post-a-uiimage-to-the-web/
应该包含您需要的一切。你需要扩展PHP脚本来处理你的非图像参数,但这是我使用的。 :)
编辑:注意到之前的链接已损坏。新的工作
答案 1 :(得分:2)
如果我是你,我会查看ASIHTTPRequest库。它是Cocoa的HTTP客户端库,使那些通过iPhone应用程序进行大量网络交互的人们的生活变得更加轻松。
这是我,使用ASIFormDataRequest(ASIHTTPRequest的一个组件)从我的iPhone应用程序上传图像。客户对这些图像的术语是“标记” - 它们位于本地区域内用户拍摄的本地图片的地图上。邀请用户“打造你的商标”。你可以想象随之而来的欢闹。
Anyhoo,self.mark
是我的Mark类的一个实例,它封装了我正在上传的图像和详细信息包的数据。我在这个方法的第一行使用了一个数据管理器单例,它包含当前的CLLocation,所以我可以得到这张图片的地理编码信息。
注意我不关心编码类型或多部分边界。图书馆处理所有这些。
-(void)completeUpload
{
CLLocation *currentLoc = [DataManager sharedDataManager].currentLocation;
self.mark.latitude = [NSNumber numberWithDouble:currentLoc.coordinate.latitude];
self.mark.longitude = [NSNumber numberWithDouble:currentLoc.coordinate.longitude];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:
[NSURL URLWithString:[NSString stringWithFormat:@"%@image_upload.php", WEBAPPURL]]];
[request setPostValue:self.mark.titleText forKey:@"title"];
[request setPostValue:self.mark.descriptionText forKey:@"description"];
[request setPostValue:self.mark.event.guid forKey:@"event"];
[request setPostValue:self.mark.latitude forKey:@"latitude"];
[request setPostValue:self.mark.longitude forKey:@"longitude"];
[request setPostValue:self.mark.project forKey:@"project"];
[request setPostValue:[[NSUserDefaults standardUserDefaults] valueForKey:@"userID"] forKey:@"user_id"];
request.timeOutSeconds = 120;
int i = 1;
for (NSString *tag in self.tags) {
[request setPostValue:tag forKey:[NSString stringWithFormat:@"tag-%d", i]];
i++;
}
NSData *imageData = UIImagePNGRepresentation(self.mark.image);
NSData *thumbData = UIImagePNGRepresentation(self.mark.thumbnail);
[request setData:imageData forKey:@"file"];
[request setData:thumbData forKey:@"thumb"];
self.progress.progress = 20.0;
[request setUploadProgressDelegate:self.progress];
request.showAccurateProgress = YES;
request.delegate = self;
[request startAsynchronous];
}
编辑:顺便说一下,我发布的PHP脚本是HTTP身份验证的背后。 ASI缓存了这些凭据,我之前提供过它们,所以我不必再在这里提供它们。我注意到,因为否则,这篇文章和相应的PHP脚本的编写方式,任何人都可以伪造任何其他人的用户ID值并在其用户名下发布任何内容。在构建这样的应用程序时,您必须考虑Web应用程序的安全性,与它是一个网站没有什么不同。它实际上是一个网站,只是浏览非传统的客户端。
答案 2 :(得分:2)
NSData *imageData=UIImageJPEGRepresentation(imageview.image, 1.0); NSString *filename=@"nike.jpg" NSString *urlString = @"http://xyz.com/file_upload/file1.php"; NSMutableURLRequest *request =[[[NSMutableURLRequest alloc] init] autorelease]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSString *boundary = [NSString stringWithString:@"-----------------99882746641449"]; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; NSMutableData *body = [NSMutableData data]; NSMutableString * string = [[NSMutableString alloc] init]; [string appendFormat:@"\r\n\r\n--%@\r\n", boundary]; [string appendFormat:@"Content-Disposition: form-data; name=\"emailid\"\r\n\r\n"]; [string appendFormat:@"pradz39@gmail.com"]; //value [body appendData:[string dataUsingEncoding:NSUTF8StringEncoding]]; // encrypt the entire body [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n",filename]] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:imageData]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [string release]; [request setHTTPBody:body]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];