目标c - 通过http POST发送图像

时间:2012-05-29 22:04:07

标签: objective-c ios http http-post nsmutableurlrequest

我正在尝试了解如何使用http POST和我当前的客户端 - 服务器协议设计发送图像。 从客户端到服务器的所有消息都类似于下面的示例,有一个带参数cmd的cmd字符串以及一些更相关的命令参数。

例如,这就是我向服务器发送短信的方式:

- (void)sendMessagesWithText:(NSString *)text fromUser:(NSString *)userId
{
    NSString *url = SERVER_URL;

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

    NSMutableData *body = [NSMutableData data];

    [body appendData:[[NSString stringWithFormat:@"cmd=%@&userid=%@&msgtext=%@", 
                       @"sendmessage", 
                       userId,
                       text] dataUsingEncoding:NSUTF8StringEncoding]];


    [request setHTTPBody:body];

    // send to server
    [[NetworkHelper sharedManager] sendRequest:request]; 
}

现在我想让用户也发送图像,但是如何使用我的协议设计发送它?我应该在cmd字符串后将图像附加到正文吗?

2 个答案:

答案 0 :(得分:6)

您需要发布multipart / form-data。

以下是现已解散的ASI的示例:Creating and running requests

  

使用ASIFormDataRequest

发送表单POST      

要以与网页表单兼容的方式发送POST数据,请使用附带的ASIFormDataRequest子类。在上传二进制数据或文件时,数据以“application / x-www-form-urlencoded”格式或“multipart / form-data”格式发布。根据需要从磁盘读取文件中的数据,因此只要您的Web服务器设置为处理它们,就可以POST POST大文件。

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"Ben" forKey:@"first_name"];
[request setPostValue:@"Copsey" forKey:@"last_name"];
[request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];
  

ASIFormDataRequest将通过setFile:forKey:自动检测添加到POST的mime类型的文件(在iOS 3.0或更高版本的Mac上),并将其包含在发送到服务器的mime标头中。如果您愿意,可以使用较长的表单来覆盖它:


Multipart/form-data很糟糕。相信我,几年前我用C ++实现了它。让其他人去做肮脏的工作。

但如果你还想独自去做。我找到了thisthis。祝你好运。

答案 1 :(得分:4)

只需将图像的NSData版本附加到POST正文。

[body appendData:[[NSString stringWithFormat:@"cmd=%@&userid=%@&msgtext=%@", @"sendmessage&image=", userId, text] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData: UIImagePNGRepresentation((UIImage *) myImage)];

然而,查看ASIHTTPRequest可能更容易,您可以使用:

[request setPostValue:myImageData forKey:@"image"];