iOS post异步请求图片上传的实现
2015-11-30 15:33
357 查看
1 网络请求中常用的有GET请求,POST请求,还有Head Put Delegate Options Trace Connect等
GET: 获取指定资源
POST:向指定资源提交数据进行处理请求,在RESTfull风格中用于新增资源
HEAD:获取指定资源头部信息
PUT:替换指定资源(不支持浏览器操作)
DELETE:删除指定资源
OPTIONS:允许客户端查看服务器的性能
TRACE:回复显示器收到的请求,主要用于测试或诊断
CONNECT:预留给能够将连接改为管道方式的代理服务器(HTTP代理使用)
2 上传图片在网页中最常用的就是POST请求,将图片编码到POST请求体中(body),通过请求数据一起发送到服务器上;
3 在iOS 开发中,图片上传的请求体比较难写
--Boundary+72D4CD655314C423
// 分割符,以“--”开头,后面的字随便写,只要不写中文即可
Content-Disposition:
form-data; name="file"; filename="1.png" // 这里注明服务器接收图片的参数及服务器上保存图片的文件名
Content-Type:image/png //
图片类型为png
Content-Transfer-Encoding:
binary // 编码方式
[align=left] // 这里是空一行,必不可少!![/align]
... contents of
boris.png ... // 图片数据部分
[align=left]--Boundary+72D4CD655314C423-- // 分隔符后面以"--"结尾,表明结束[/align]
如果有其他表单数据,如传用户ID等参数,也要写成以上格式:
[align=left]
[/align]
具体参数含义与图片一致,一般这段会在图片上面,因此没有结尾符,如果没有其他数据了,那要加上结尾符。
#import "SecondViewController.h"
@interface
SecondViewController ()
@property (nonatomic ,
strong)NSMutableData *myResponseData;
@property (nonatomic ,
copy)NSString *path;
@property (nonatomic ,
copy)NSString *token;
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super
viewDidLoad];
NSString *urlStr =
@"http://upload.qiniu.com/";
_path = [[NSBundle
mainBundle] pathForResource:@"1.png"
ofType:nil];
_token =
@"oIERcq2no59Pv4LtQXZM99Oye33cewMOrt0JzbX7:X4PGVSLT3xS1UoOLC38E3MquLhM=:eyJzY29wZSI6ImFvbGlhbyIsImRlYWRsaW5lIjoxNDQ4ODcxNjkyfQ==";
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:[NSURL
URLWithString:urlStr] cachePolicy:0
timeoutInterval:5.0f];
// //发送异步请求
// //获取一个主队列
[self
uploadWithRequest:request withPath:_path
withToken:_token];
//直接利用sendAsynchronousRequest
达到异步请求的作用
// NSOperationQueue *queue = [NSOperationQueue mainQueue];
// [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//
// NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
// NSLog(@"%@",dic);
// }];
}
- (void)uploadWithRequest:(NSMutableURLRequest *)request withPath:(NSString *)path withToken:(NSString *)token
{
NSString *boundary = [NSString
stringWithFormat:@"Boundary+%08X%08X", arc4random(), arc4random()];
NSMutableData *body = [NSMutableData data];
//
表单数据
NSMutableDictionary *param = [[NSMutableDictionary alloc] init];
[param setValue:@"home" forKey:@"key"];
[param setValue:token forKey:@"token"];
[param
enumerateKeysAndObjectsUsingBlock:^(id key,
id obj,
BOOL *stop) {
NSMutableString *fieldStr = [NSMutableString string];
[fieldStr appendString:[NSString
stringWithFormat:@"--%@\r\n", boundary]];
[fieldStr appendString:[NSString
stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key]];
[fieldStr appendString:[NSString
stringWithFormat:@"%@", obj]];
[body appendData:[fieldStr dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
}];
///
图片数据部分
NSMutableString *topStr = [NSMutableString string];
// NSString *path = [[NSBundle mainBundle] pathForResource:@"1.png" ofType:nil];
NSData *data = [NSData dataWithContentsOfFile:path];
[topStr appendString:[NSString stringWithFormat:@"--%@\r\n", boundary]];
[topStr appendString:@"Content-Disposition: form-data; name=\"file\"; filename=\"1.png\"\r\n"];
[topStr appendString:@"Content-Type:image/png\r\n"];
[topStr appendString:@"Content-Transfer-Encoding: binary\r\n\r\n"];
[body appendData:[topStr dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:data];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
NSString *bottomStr = [NSString
stringWithFormat:@"--%@--", boundary];
[body appendData:[bottomStr dataUsingEncoding:NSUTF8StringEncoding]];
//
设置请求类型为post请求
request.HTTPMethod = @"post";
//
设置request的请求体
request.HTTPBody = body;
// 设置头部数据,标明上传数据总大小,用于服务器接收校验
[request setValue:[NSString stringWithFormat:@"%ld", body.length] forHTTPHeaderField:@"Content-Length"];
//
设置头部数据,指定了http post请求的编码方式为multipart/form-data(上传文件必须用这个)。
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField:@"Content-Type"];
_myResponseData = [[NSMutableData alloc] init];
//利用delegate达到异步请求的作用
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
}
#pragma mark -- NSURLConnectionDelegate ---
//发出网络请求后,对方会有一个响应,告诉你,它已经收到网络请求了
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
[_myResponseData setLength:0];
[UIApplication sharedApplication].networkActivityIndicatorVisible =
YES;
}
//网络请求结束后
调用的方法
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
[UIApplication
sharedApplication].networkActivityIndicatorVisible =
NO;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:_myResponseData options:kNilOptions error:nil];
NSLog(@"%@",dic);
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[_myResponseData appendData:data];
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"%@",error);
}
GET: 获取指定资源
POST:向指定资源提交数据进行处理请求,在RESTfull风格中用于新增资源
HEAD:获取指定资源头部信息
PUT:替换指定资源(不支持浏览器操作)
DELETE:删除指定资源
OPTIONS:允许客户端查看服务器的性能
TRACE:回复显示器收到的请求,主要用于测试或诊断
CONNECT:预留给能够将连接改为管道方式的代理服务器(HTTP代理使用)
2 上传图片在网页中最常用的就是POST请求,将图片编码到POST请求体中(body),通过请求数据一起发送到服务器上;
3 在iOS 开发中,图片上传的请求体比较难写
--Boundary+72D4CD655314C423
// 分割符,以“--”开头,后面的字随便写,只要不写中文即可
Content-Disposition:
form-data; name="file"; filename="1.png" // 这里注明服务器接收图片的参数及服务器上保存图片的文件名
Content-Type:image/png //
图片类型为png
Content-Transfer-Encoding:
binary // 编码方式
[align=left] // 这里是空一行,必不可少!![/align]
... contents of
boris.png ... // 图片数据部分
[align=left]--Boundary+72D4CD655314C423-- // 分隔符后面以"--"结尾,表明结束[/align]
如果有其他表单数据,如传用户ID等参数,也要写成以上格式:
[align=left]
[/align]
具体参数含义与图片一致,一般这段会在图片上面,因此没有结尾符,如果没有其他数据了,那要加上结尾符。
#import "SecondViewController.h"
@interface
SecondViewController ()
@property (nonatomic ,
strong)NSMutableData *myResponseData;
@property (nonatomic ,
copy)NSString *path;
@property (nonatomic ,
copy)NSString *token;
@end
@implementation SecondViewController
- (void)viewDidLoad {
[super
viewDidLoad];
NSString *urlStr =
@"http://upload.qiniu.com/";
_path = [[NSBundle
mainBundle] pathForResource:@"1.png"
ofType:nil];
_token =
@"oIERcq2no59Pv4LtQXZM99Oye33cewMOrt0JzbX7:X4PGVSLT3xS1UoOLC38E3MquLhM=:eyJzY29wZSI6ImFvbGlhbyIsImRlYWRsaW5lIjoxNDQ4ODcxNjkyfQ==";
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:[NSURL
URLWithString:urlStr] cachePolicy:0
timeoutInterval:5.0f];
// //发送异步请求
// //获取一个主队列
[self
uploadWithRequest:request withPath:_path
withToken:_token];
//直接利用sendAsynchronousRequest
达到异步请求的作用
// NSOperationQueue *queue = [NSOperationQueue mainQueue];
// [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//
// NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
// NSLog(@"%@",dic);
// }];
}
- (void)uploadWithRequest:(NSMutableURLRequest *)request withPath:(NSString *)path withToken:(NSString *)token
{
NSString *boundary = [NSString
stringWithFormat:@"Boundary+%08X%08X", arc4random(), arc4random()];
NSMutableData *body = [NSMutableData data];
//
表单数据
NSMutableDictionary *param = [[NSMutableDictionary alloc] init];
[param setValue:@"home" forKey:@"key"];
[param setValue:token forKey:@"token"];
[param
enumerateKeysAndObjectsUsingBlock:^(id key,
id obj,
BOOL *stop) {
NSMutableString *fieldStr = [NSMutableString string];
[fieldStr appendString:[NSString
stringWithFormat:@"--%@\r\n", boundary]];
[fieldStr appendString:[NSString
stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key]];
[fieldStr appendString:[NSString
stringWithFormat:@"%@", obj]];
[body appendData:[fieldStr dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
}];
///
图片数据部分
NSMutableString *topStr = [NSMutableString string];
// NSString *path = [[NSBundle mainBundle] pathForResource:@"1.png" ofType:nil];
NSData *data = [NSData dataWithContentsOfFile:path];
[topStr appendString:[NSString stringWithFormat:@"--%@\r\n", boundary]];
[topStr appendString:@"Content-Disposition: form-data; name=\"file\"; filename=\"1.png\"\r\n"];
[topStr appendString:@"Content-Type:image/png\r\n"];
[topStr appendString:@"Content-Transfer-Encoding: binary\r\n\r\n"];
[body appendData:[topStr dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:data];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
NSString *bottomStr = [NSString
stringWithFormat:@"--%@--", boundary];
[body appendData:[bottomStr dataUsingEncoding:NSUTF8StringEncoding]];
//
设置请求类型为post请求
request.HTTPMethod = @"post";
//
设置request的请求体
request.HTTPBody = body;
// 设置头部数据,标明上传数据总大小,用于服务器接收校验
[request setValue:[NSString stringWithFormat:@"%ld", body.length] forHTTPHeaderField:@"Content-Length"];
//
设置头部数据,指定了http post请求的编码方式为multipart/form-data(上传文件必须用这个)。
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField:@"Content-Type"];
_myResponseData = [[NSMutableData alloc] init];
//利用delegate达到异步请求的作用
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
}
#pragma mark -- NSURLConnectionDelegate ---
//发出网络请求后,对方会有一个响应,告诉你,它已经收到网络请求了
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
[_myResponseData setLength:0];
[UIApplication sharedApplication].networkActivityIndicatorVisible =
YES;
}
//网络请求结束后
调用的方法
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
[UIApplication
sharedApplication].networkActivityIndicatorVisible =
NO;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:_myResponseData options:kNilOptions error:nil];
NSLog(@"%@",dic);
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[_myResponseData appendData:data];
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"%@",error);
}
相关文章推荐
- iOS 中KVC、KVO、NSNotification、delegate 总结及区别
- iOS设置状态栏背景色与前景色
- IOS学习之多线程(1)--多线程简单介绍
- IOS图层Layer学习笔记(七)—— CAGradientLayer
- iOS 9音频应用播放音频之音量设置与声道设置
- iOS各个控件之间通信有哪些模式
- iOS 设计模式——组合
- IOS实现视频直播-RTMP协议的一些参考资料
- 常用iOS URL Scheme附录
- BIOS中断大全
- ios 多线程必读内容 :锁
- iOS开发常用正则表达式
- ios手势
- iOS 9音频应用播放音频之音量设置与声道设置
- iOS备忘录之CocoaPods的安装
- 如何设计一个 iOS 控件?(iOS 控件完全解析)
- iOS 9音频应用播放音频之音量设置与声道设置
- FXForms,自动生成iOS表单
- FXForms,自动生成iOS表单
- 谈谈对ios之协议代理的理解