目标c – 通过http POST发送图像
我正在尝试了解如何使用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字符串后将图像附加到正文吗?
您需要发布multipart / form-data。
以下是现已解散的ASI的示例: 创建和运行请求
使用ASIFormDataRequest发送表单POST
要以与网页表单兼容的方式发送POST数据,请使用包含的ASIFormDataRequest子类。 在上传二进制数据或文件时,数据以“application / x-www-form-urlencoded”格式或“multipart / form-data”格式发布。 根据需要从磁盘读取文件中的数据,因此只要您的Web服务器设置为处理它们,POSTing大文件就可以了。
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 ++实现了它。 让其他人去做肮脏的工作。
但如果你还想独自去做。 我发现了这个和这个 。 祝你好运。
只需将图像的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"];