IOS开发--上传图片

IOS图片上传功能实现总结

IOS图片上传主要分两种方式实现,一个是将图片信息以表单的形式上传,一种是将图片以JSON的格式上传。

首先要讲的是以这两个方式上传的一个比较明显的区别就是HTTP Header是如何标记的,以表单的形式上传时HTTP Header应该设置为multipart/form-data,以JSON格式上传时HTTP Header应该设置为application/json。

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. Content-Type: multipart/form-data; boundary=${bound}  
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. Content-Type: application/json  


了解了这些那我们在IOS项目中应该如何运用他们呢?

一、表单上传图片

       

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //分界线的标识符  
  2. NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";  
  3. //根据url初始化request  
  4. NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]  
  5.                                                        cachePolicy:NSURLRequestReloadIgnoringLocalCacheData  
  6.                                                    timeoutInterval:10];  
  7. //分界线 --AaB03x  
  8. NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];  
  9. //结束符 AaB03x--  
  10. NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];  
  11. //要上传的图片  
  12. UIImage *image=[params objectForKey:@"pic"];  
  13. //得到图片的data  
  14. NSData* data = UIImagePNGRepresentation(image);  
  15. //http body的字符串  
  16. NSMutableString *body=[[NSMutableString alloc]init];  
  17. //参数的集合的所有key的集合  
  18. NSArray *keys= [params allKeys];  
  19.   
  20. //遍历keys  
  21. for(int i=0;i<[keys count];i++)  
  22. {  
  23.     //得到当前key  
  24.     NSString *key=[keys objectAtIndex:i];  
  25.     //如果key不是pic,说明value是字符类型,比如name:Boris  
  26.     if(![key isEqualToString:@"pic"])  
  27.     {  
  28.         //添加分界线,换行  
  29.         [body appendFormat:@"%@ ",MPboundary];  
  30.         //添加字段名称,换2行  
  31.         [body appendFormat:@"Content-Disposition: form-data; name="%@" ",key];  
  32.         //添加字段的值  
  33.         [body appendFormat:@"%@ ",[params objectForKey:key]];  
  34.     }  
  35. }  
  36.   
  37. ////添加分界线,换行  
  38. [body appendFormat:@"%@ ",MPboundary];  
  39. //声明pic字段,文件名为boris.png  
  40. [body appendFormat:@"Content-Disposition: form-data; name="pic"; filename="boris.png" "];  
  41. //声明上传文件的格式  
  42. [body appendFormat:@"Content-Type: image/png "];  
  43.   
  44. //声明结束符:--AaB03x--  
  45. NSString *end=[[NSString alloc]initWithFormat:@" %@",endMPboundary];  
  46. //声明myRequestData,用来放入http body  
  47. NSMutableData *myRequestData=[NSMutableData data];  
  48. //将body字符串转化为UTF8格式的二进制  
  49. [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];  
  50. //将image的data加入  
  51. [myRequestData appendData:data];  
  52. //加入结束符--AaB03x--  
  53. [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];  
  54.   
  55. //设置HTTPHeader中Content-Type的值  
  56. NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];  
  57. //设置HTTPHeader  
  58. [request setValue:content forHTTPHeaderField:@"Content-Type"];  
  59. //设置Content-Length  
  60. [request setValue:[NSString stringWithFormat:@"%d", [myRequestData length]] forHTTPHeaderField:@"Content-Length"];  
  61. //设置http body  
  62. [request setHTTPBody:myRequestData];  
  63. //http method  
  64. [request setHTTPMethod:@"POST"];  
  65.   
  66. //建立连接,设置代理  
  67. NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];  
  68.   
  69. //设置接受response的data  
  70. if (conn) {  
  71.     mResponseData = [[NSMutableData data] retain];  
  72. }  

二、JSON上传图片

     

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
    1.     //根据url初始化request  
    2.     NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]  
    3.                                                            cachePolicy:NSURLRequestReloadIgnoringLocalCacheData  
    4.                                                        timeoutInterval:10];  
    5.   
    6.     //要上传的图片  
    7.     UIImage *image=[params objectForKey:@"pic"];  
    8.     //得到图片的data  
    9.     NSData* data = UIImagePNGRepresentation(image);  
    10.     //base64编码  
    11.     NSString *photoStr = [data base64Encoding];  
    12.   
    13.     //参数字典  
    14.     NSDictionary *params = [[NSDictionary alloc] init];  
    15.     [params setObject:@{@"avatar": photoStr} forKey:@"profile"];   
    16.     NSData *myRequestData  = [NSMutableData dataWithData:[NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil]];  
    17.      
    18. //设置http header  
    19. [request.request setValue:@"application/json" forHTTPHeaderField:@"Content-type"];  
    20.     [request.request setValue:@"application/json" forHTTPHeaderField:@"Accept"];  
    21.   
    22.     //设置http body  
    23.     [request setHTTPBody:myRequestData];  
    24.     //http method  
    25.     [request setHTTPMethod:@"POST"];  
    26.       
    27.     //建立连接,设置代理  
    28.     NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];  
    29.       
    30.     //设置接受response的data  
    31.     if (conn) {  
    32.         mResponseData = [[NSMutableData data] retain];  
    33.     }  
原文地址:https://www.cnblogs.com/wanghuaijun/p/5416032.html