将Post数据添加到Image Upload

时间:2011-05-25 11:04:09

标签: iphone html objective-c

我使用this answerthis question中的代码将我的iPhone应用程序中的图像发布到网站上的php页面。本质上,代码创建正确格式化的html流并提交它。

为了完整性,我重新发布了代码。

- (BOOL)uploadImage:(NSData *)imageData filename:(NSString *)filename{


    NSString *urlString = @"http://www.yourdomainName.com/yourPHPPage.php";

    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
    [request setURL:[NSURL URLWithString:urlString]];
    [request setHTTPMethod:@"POST"];

    NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];

    NSMutableData *body = [NSMutableData data];
    [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]];
    [request setHTTPBody:body];

    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

    return ([returnString isEqualToString:@"OK"]);
}

但是我不够聪明:(想弄清楚如何添加通用字段值,例如。我想添加一个Comment字段与图像文件一起提交。

有关如何修改该代码以向POST表单添加多个字段的任何建议。

谢谢。

更新:我可以通过修改我发布的URL来包含GET参数来实现它,但我宁愿使用所有post params。

3 个答案:

答案 0 :(得分:3)

这并不太难。 multipart / form-data帖子的一般格式如下:

--boundary-string
Content-Disposition: form-data; name="field1"

value1
--boundary-string
Content-Disposition: form-data; name="field2"

value2
--boundary-string--

文件上传是一种特殊情况,但您已经处理过了。要添加另一个字段,只需添加另一个块。这样的事情应该这样做:

NSMutableData *body = [NSMutableData data];

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"Comment\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[comment dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n",filename] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"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]];
[request setHTTPBody:body];
顺便说一句,你几乎不需要调用NSString的stringWithString:方法。如果您需要副本,请致电copy,否则只需使用您已有的字符串即可。 NS Mutable 字符串的stringWithString:可以作为[[string mutableCopy] autorelease]的替代方案。

答案 1 :(得分:1)

首先,您应该使用NSMutableURLRequest对象的addValue:forHTTPHeaderField:方法来添加标头。例如

[request addValue:@"application/octet-stream" forHTTPHeaderField:@"Content-Type"];
[request addValue:[NSString stringWithFormat:@"form-data; name=\"userfile\"; filename=\"%@\"",filename] forHTTPHeaderField:@"Content-Disposition"];
...

如上所述设置所有标头之后,在代码中的第二个,您应该使用下面的代码设置POST数据。

NSMutableData *body = [[NSMutableData alloc] init];
[body appendData:[[NSString stringWithString:@"name=myimagename.png"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"&data="] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:imageData]];
[body release];
[request setHTTPBody:body];

但是当且仅当服务器支持这种格式时,它才会起作用(我的意思是 data = image binary data& name = image name )。

答案 2 :(得分:1)

我建议使用ASIHttp。见ASIFormDataRequest