使用原生态的api上传文件的实现:

来源:互联网 发布:android 5高级编程 编辑:程序博客网 时间:2024/06/06 01:34
  1. 使用原生态的api上传文件的实现:

  2. #import "MainViewController.h"  
  3.   
  4. @interface MainViewController ()  
  5. @property (weak, nonatomicUIImageView *imageView;  
  6. @end  
  7.   
  8. @implementation MainViewController  
  9.   
  10.   
  11. - (void)viewDidLoad  
  12. {  
  13.     [super viewDidLoad];  
  14.     //定义Imageview并设置图像  
  15.     UIImage *image = [UIImage imageNamed:@"头像1.png"];  
  16.     UIImageView *imageView = [[UIImageView alloc]initWithImage:image];  
  17.     [imageView setFrame:CGRectMake(6020200200)];  
  18.     [self.view addSubview:imageView];  
  19.     self.imageView = imageView;  
  20.       
  21.     UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
  22.     [button setFrame:CGRectMake(6024020040)];  
  23.       
  24.     [button setTitle:@"upload" forState:UIControlStateNormal];  
  25.     [self.view addSubview:button];  
  26.       
  27.     [button addTarget:self action:@selector(uploadImage) forControlEvents:UIControlEventTouchUpInside];  
  28.     [self.view addSubview:button];  
  29. }  
  30.   
  31. #pragma mark 上传文件(图像)  
  32. - (void)uploadImage  
  33. {  
  34.     NSLog(@"upload");  
  35.     //思路: 需要使用http的post方法上传文件  
  36.     //调用的url是http://localhost/~apple/itcast/upload.php  
  37.     //数据体的参数名:file  
  38.       
  39.     //1建立URL  
  40.     NSURL *url = [NSURL URLWithString:@"http://localhost/~apple/itcast/upload.php"];  
  41.     //2建立NSMutableRequest  
  42.     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];  
  43.     //1)设置request的属性,设置方法  
  44.     [request setHTTPMethod:@"POST"];  
  45.       
  46.       
  47.       
  48.       
  49.     //2)设置数据体  
  50.     //1> 设置boundary的字符串,可以复用  
  51.       
  52.     NSString *boundary = @"uploadBoundary";  
  53.     //2>头部字符串  
  54.       
  55.     NSMutableString *startStr = [NSMutableString string];  
  56.     [startStr appendFormat:@"--%@\n", boundary];  
  57.     [startStr appendString:@"Content-Disposition: form-data; name=\"file\"; filename=\"upload.png\"\n"];  
  58.     [startStr appendString:@"Content-Type: image/png\n\n"];  
  59.       
  60.     //3>尾部字符串  
  61.     NSMutableString *endStr = [NSMutableString string];  
  62.     [endStr appendFormat:@"--%@\n", boundary];  
  63.     [endStr appendString:@"Content-Disposition: form-data: name=\"submit\"\n\n"];  
  64.     [endStr appendString:@"Submit\n"];  
  65.     [endStr appendFormat:@"--%@--", boundary];  
  66.       
  67.     //4>拼接数据体  
  68.     NSMutableData *bodyData = [NSMutableData data];  
  69.     [bodyData appendData:[startStr dataUsingEncoding:NSUTF8StringEncoding]];  
  70.     NSData *imageData = UIImagePNGRepresentation(self.imageView.image);  
  71.     [bodyData appendData:imageData];  
  72.     [bodyData appendData:[endStr dataUsingEncoding:NSUTF8StringEncoding]];  
  73.     [request setHTTPBody:bodyData];  
  74.       
  75.     //5>指定Content-Type,在上传文件时,需要指定content-type和content-length  
  76.     NSString *contentStr = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];  
  77.     [request setValue:contentStr forKey:@"Content-Type"];  
  78.       
  79.     //6>指定Content-Length  
  80.     NSInteger length = [bodyData length];  
  81.     [request setValue:[NSString stringWithFormat:@"%d", length] forKey:@"Content-Length"];  
  82.       
  83.       
  84.       
  85.       
  86.     //3使用NSURLConnection的同步方法上传文件,因为需要用户确认文件是否上传成功。  
  87.     //在使用http上传文件时,通常是有大小限制的。一般不会超过2M.  
  88.     NSURLResponse *response = nil;  
  89.     NSError *error = nil;  
  90.     NSData *resultData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];  
  91.     NSString *resultStr = [[NSString alloc]initWithData:resultData encoding:NSUTF8StringEncoding];  
  92.     NSLog(@"%@", resultStr);  
  93. }  
  94.   
  95. @end
0 0