2

我试图了解如何使用 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 字符串之后将图像附加到正文吗?

4

2 回答 2

6

您需要使用 multipart/form-data 发布。

以下是现已失效的 ASI 的示例:创建和运行请求

使用 ASIFormDataRequest 发送表单 POST

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

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 标头中。如果您愿意,可以使用较长的形式来覆盖它:


多部分/表单数据很糟糕。相信我,几年前我已经用 C++ 实现了它。让别人做肮脏的工作。

但如果你还想一个人去。我找到了这个这个。祝你好运。

于 2012-05-29T22:35:27.293 回答
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"];
于 2012-05-29T22:07:06.080 回答