刚刚接触到一个图片上传的问题,困扰了三天,最后终得以领悟其中精髓。废话不多说,直接上代码
NSURL *url = [NSURL URLWithString:@"http://192.168.1.62:8080/TinyBusiness/"];
AFHTTPClient *httpClient = [AFHTTPClient clientWithBaseURL:url];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 设置时间格式
formatter.dateFormat = @"yyyyMMddHHmmss";
NSString *str = [formatter stringFromDate:[NSDate date]];
NSString *fileName = [NSString stringWithFormat:@"%@.png", str];
MYLog(@"fileName=%@",fileName);
// NSData *data = UIImagePNGRepresentation(imageNew);
//转换成data数据
NSData *data = UIImagePNGRepresentation(imageDownView.image);
//data转换成base64
NSString *encodedImageStr = [data base64EncodedStringWithOptions:0];
NSDictionary *myDick = @{
@"merNo":_indefine,
@"comName": name.text,
@"comRepertory":repertory.text,
@"comPrize":price.text,
@"image":encodedImageStr,
@"comFreight":freight.text,
@"comType":classify.text
};
//生成post请求
NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"post" path:@"addCommodityAction!addCommodity" parameters:myDick constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
MYLog(@"%@",data);
MYLog(@"---------%@",encodedImageStr);
[formData appendPartWithFileData:data name:@"image" fileName:fileName mimeType:@"image/png"];
}];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc]initWithRequest:request];
[op setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
NSLog(@"上传 %f", (float)(totalBytesWritten / totalBytesExpectedToWrite));
}];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
MYLog(@"成功");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
MYLog(@"失败");
}];
[op start];
说起来挺简单的,上传图片无非是把图片转成两种格式服务器才可以接收,一种是二进制,一种是base64.本人研究了好久二进制这个东东,发现image图片转为data数据的时候貌似是生成的十六进制,没办法十六进制服务器人员根本不知道怎么去转化成图片,只好换另一种方法,转换成base64,以字符串的格式写入,这样子服务器也就能接收出来图片了,服务器接收base64格式的图片是需要先后台先base64_decode,后台做服务器的不懂怎么接收的人员看一下就知道了,很简单的东东,过一段时间让朋友把服务器接收base64格式的代码传上来,供大家参考。
PS:本人使用的AFNetWork框架,还是蛮好用的,不知道怎么用的可以自己去查一下,其实本人建议ASI框架还是不要用了,虽然它比AFN强大,但同样的也要比AFN复杂,并且还不支持ARC,据说12年的时候就停止更新了,当然不是停止更新了就不能使用了,这只是小编的一点建议,没有别的意思,希望使用ASI框架的大牛勿喷。