使用NSMutable请求上传UIImage

时间:2010-09-01 07:23:15

标签: iphone post file-upload multipartform-data

我需要POST一个请求。该请求有3个参数,'email_id','location'和'image_data'。 'image_data'的值包含UIImage的NSData jpeg表示。必须使用内容类型的multipart / form-data提交请求。如何创建NSMutableRequest以发布此请求?我该如何设置边界?是整个数据包所需的边界还是仅适用于图像部分?

3 个答案:

答案 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];