虽然现在第三方框架已经足够强大,但是对于原生态的东西多了解一下也是很精彩的。图片上传的本质大部分是将上传的内容提交到服务器的一个页面的form表单中,而表单提交的参数我们通常可以用firefox浏览器来抓取,抓取成功后再根据这些参数设置IOS端代码的相关参数。一下就是原生的上传图片的例子
#pragma mark - 上传图像
- (void)uploadImage{
// 思路:需要使用HTTP的POST方法上传文件
// 调用的URL是http://localhost/~apple/pofabs/upload.php,这是一个上传文件的form表单页面
// 数据体的参数名:file
// 1. 建立NSURL
NSURL *url = [NSURL URLWithString:@"http://localhost/~apple/pofabs/upload.php"];
// 2. 建立NSMutableURLRequest
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 1) 设置request的属性,设置方法
[request setHTTPMethod:@"POST"];
// 2) 设置数据体
// 1> 设置boundary的字符串,以便复用
NSString *boundary = @"uploadPofabs";
// 2> 头部字符串
NSMutableString *startStr = [NSMutableString string];
[startStr appendFormat:@"--%@\n", boundary];
[startStr appendString:@"Content-Disposition: form-data; name=\"file\"; filename=\"bugIsShit.png\"\n"];//注意转义字符的用处
[startStr appendString:@"Content-Type: image/png\n\n"];
// 3> 尾部字符串
NSMutableString *endStr = [NSMutableString string];
[endStr appendFormat:@"--%@\n", boundary];
[endStr appendString:@"Content-Disposition: form-data; name=\"submit\"\n\n"];
[endStr appendString:@"Submit\n"];
[endStr appendFormat:@"--%@--", boundary];
// 4> 拼接数据体
NSMutableData *bodyData = [NSMutableData data];
[bodyData appendData:[startStr dataUsingEncoding:NSUTF8StringEncoding]];
NSData *imageData = UIImagePNGRepresentation(self.imageView.image);
[bodyData appendData:imageData];
[bodyData appendData:[endStr dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:bodyData];
// 5> 指定Content-Type,在上传文件时,需要指定Content-Type & Content-Length
NSString *contentStr = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request setValue:contentStr forHTTPHeaderField:@"Content-Type"];
// 6> 指定Content-Length
NSUInteger length = [bodyData length];
[request setValue:[NSString stringWithFormat:@"%d", length] forHTTPHeaderField:@"Content-Length"];
// 3. 使用NSURLConnection的同步方法上传文件,因为需要用户确认文件是否上传成功!
// 在使用HTTP上传文件时,通常是有大小限制的,一般不会超过2M
NSURLResponse *response = nil;
NSError *error = nil;
NSData *resultData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *resultStr = [[NSString alloc]initWithData:resultData encoding:NSUTF8StringEncoding];
NSLog(@"%@", resultStr);
}