AFN(3.1.0) 图片上传 与 AFHTTPRequestOperation 上传的不同
2016-06-02 14:14
399 查看
在开发过程中,经常性的要把图片资源发送给服务器,
AFNetworking 基本是网络处理的基本框架,在最新 AFN 3.0.0 以后, AFN 已经摒弃了对 NSURLConnection 的支持,全力使用 NSURLSession 来处理网络请求.但一些老一点的项目当中, AFN 可能还比较古老,老框架和最新的 AFN 3.1.0 在网络请求上面有什么区别呢? 就以图片上传为例:
(1) AFN2.0 以前的来上传图片:
1. 设置请求头
+ (AFHTTPClient *)getNsurlRequestPath:(NSString *)path params:(NSDictionary *)params method:(NSString *)method
{
AFHTTPClient *client = [AFHTTPClient
clientWithBaseURL:[NSURL
URLWithString:shareTool.baseUrl]];
//设置header
[client setDefaultHeader:@"xxx"
value:xxx];
[client setDefaultHeader:@"xxx"
value:xxx];
// 或取当前时间戳
NSString *timeInterval = [NSString
stringWithFormat:@"%f",[[NSDate
date] timeIntervalSince1970]];
[client setDefaultHeader:@"r"
value:timeInterval];
// EncryPtionTool MD5 加密处理类
[client setAuthorizationHeaderWithUsername:kAppName
password:[EncryPtionTool
GetMd5String:[NSString
stringWithFormat:@"xxx%@%@",timeInterval,kKey]]];
return client;
}
2. 创建请求
+(void)upLoadImageSuccess:(void (^)())success failure:(void (^)(NSError *))failure
{
NSString* path=@"xxxxxxxxxxxxx";
NSMutableDictionary* param=[NSMutableDictionary
dictionary];
param[@"xxx"]=@"";
AFHTTPClient* client=[self
getNsurlRequestPath:path
params:param method:@"post"];
//
上传图片
NSURLRequest* request= [client
multipartFormRequestWithMethod:@"post"
path:path parameters:param
constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// 要上传的图片 以单张图片为例
UIImage *image = [UIImage
imageNamed:@"image_test"];
NSData *data =
UIImageJPEGRepresentation(image, 0.7);
while (data.length >
1024 * 500) {
// 压缩小于 500 k
image = [[UIImage
alloc] initWithData:data];
data = UIImageJPEGRepresentation(image,
0.07);
}
// 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
//
要解决此问题,
// 可以在上传时使用当前的系统事件作为文件名
NSDateFormatter *formatter = [[NSDateFormatter
alloc]
init];
//
设置时间格式
formatter.dateFormat =
@"yyyyMMddHHmmss";
NSString *str = [formatter
stringFromDate:[NSDate
date]];
NSString *fileName = [NSString
stringWithFormat:@"%@.png", str];
[formData appendPartWithFileData:data
name:@"file"
fileName:fileName mimeType:@"image/png"];
}];
AFHTTPRequestOperation* operation=[[AFHTTPRequestOperation
alloc]
initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation,
id responseObject) {
NSDictionary *JSON = [NSJSONSerialization
JSONObjectWithData:operation.responseData
options:NSJSONReadingMutableContainers
error:nil];
if ([JSON[@"code"]
integerValue] != 0) {
NSError* error=[[NSError
alloc] initWithDomain:JSON[@"msg"]
code:[JSON[@"code"]
integerValue] userInfo:@{@"msg" : JSON[@"msg"]}];
if (failure) {
failure(error);
return ;
}
}
if (success) {
success();
}
} failure:^(AFHTTPRequestOperation *operation,
NSError *error) {
if (failure) {
failure(error);
}
}];
/**
@param bytesWritten
每次写进的字节数
@param totalBytesWritten
总共写进的字节数
@param totalBytesExpectedToWrite
期望写进的字节数
*/
__block NSString* total=nil;
__block NSString* totalExpect=nil;
[operation setUploadProgressBlock:^(NSUInteger bytesWritten,
long long totalBytesWritten,
long long totalBytesExpectedToWrite) {
total=[NSString
stringWithFormat:@"%lld",totalBytesWritten ];
totalExpect=[NSString
stringWithFormat:@"%lld",totalBytesExpectedToWrite ];
// 监听上传进度
CGFloat progress =[total
floatValue] / [totalExpect floatValue] ;
NSLog(@"---%f",progress);
NSLog(@"Sent %d
总共 %lld of %lld bytes",bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
}];
// 执行操作
[client.operationQueue
addOperation:operation];
}
(2) AFN 3.1.0 上传图片
1.设置请求头
+(AFHTTPSessionManager*) sessionManager
{
AFHTTPSessionManager* sessinManager=[[AFHTTPSessionManager alloc] initWithBaseURL:[NSURLURLWithString:kBaseURL]];
sessinManager.responseSerializer=[AFJSONResponseSerializer serializer];
// 设置请求头
[sessinManager.requestSerializer setValue:xxx forHTTPHeaderField:@"xxx"];
[sessinManager.requestSerializer setValue:xxx forHTTPHeaderField:@"xxxx"];
// 时间戳
NSString *timeInterval = [NSString stringWithFormat:@"%f",[[NSDate date] timeIntervalSince1970]];
[sessinManager.requestSerializer setValue:timeInterval forHTTPHeaderField:@"r"];
NSString* passWord= [EncryPtionTool GetMd5String:[NSStringstringWithFormat:@"xxx%@%@",timeInterval,kKey]];
[sessinManager.requestSerializer setAuthorizationHeaderFieldWithUsername:kAppName password:passWord];
sessinManager.requestSerializer.timeoutInterval=5.0;
return sessinManager;
}
2.发送请求
+(void)downUpImageSuccess:(void
(^)(NSDictionary *))success failure:(void (^)(NSError
*))failure
{
AFHTTPSessionManager* sessionManager= [self
sessionManager];
NSString* path=@"xxxxxx";
NSMutableDictionary* param=[NSMutableDictionary
dictionary];
param[@"xxxx"]=@"";
[sessionManager POST:path
parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData>
_Nonnull formData) {
/***** 在这里直接添加上传的图片 *****/
UIImage *image = [UIImage
imageNamed:@"image_test"];
NSData *data =
UIImagePNGRepresentation(image);
// 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
//
要解决此问题,
// 可以在上传时使用当前的系统事件作为文件名
NSDateFormatter *formatter = [[NSDateFormatter
alloc]
init];
//
设置时间格式
formatter.dateFormat =
@"yyyyMMddHHmmss";
NSString *str = [formatter
stringFromDate:[NSDate
date]];
NSString *fileName = [NSString
stringWithFormat:@"%@.png", str];
[formData appendPartWithFileData:data
name:@"file"
fileName:fileName mimeType:@"image/png"];
} progress:^(NSProgress *
_Nonnull uploadProgress) {
// 获取上传进度
} success:^(NSURLSessionDataTask *
_Nonnull task, id
_Nullable JSON) {
if ([JSON[@"code"]
integerValue] !=
0) { // 返回 code
值不为 0
NSError* error=[[NSError
alloc] initWithDomain:JSON[@"msg"]
code:[JSON[@"code"]
integerValue] userInfo:@{@"msg" : JSON[@"msg"]}];
failure(error);
return ;
}
NSLog(@"上传成功");
} failure:^(NSURLSessionDataTask *
_Nullable task,
NSError * _Nonnull error) {
NSLog(@"上传失败");
failure(error);
}];
}
由上面可以看到, AFN 3.1.0 对 NSURLSession 封装,除了性能更优,相对以前,代码更集中,更易处理.
AFNetworking 基本是网络处理的基本框架,在最新 AFN 3.0.0 以后, AFN 已经摒弃了对 NSURLConnection 的支持,全力使用 NSURLSession 来处理网络请求.但一些老一点的项目当中, AFN 可能还比较古老,老框架和最新的 AFN 3.1.0 在网络请求上面有什么区别呢? 就以图片上传为例:
(1) AFN2.0 以前的来上传图片:
1. 设置请求头
+ (AFHTTPClient *)getNsurlRequestPath:(NSString *)path params:(NSDictionary *)params method:(NSString *)method
{
AFHTTPClient *client = [AFHTTPClient
clientWithBaseURL:[NSURL
URLWithString:shareTool.baseUrl]];
//设置header
[client setDefaultHeader:@"xxx"
value:xxx];
[client setDefaultHeader:@"xxx"
value:xxx];
// 或取当前时间戳
NSString *timeInterval = [NSString
stringWithFormat:@"%f",[[NSDate
date] timeIntervalSince1970]];
[client setDefaultHeader:@"r"
value:timeInterval];
// EncryPtionTool MD5 加密处理类
[client setAuthorizationHeaderWithUsername:kAppName
password:[EncryPtionTool
GetMd5String:[NSString
stringWithFormat:@"xxx%@%@",timeInterval,kKey]]];
return client;
}
2. 创建请求
+(void)upLoadImageSuccess:(void (^)())success failure:(void (^)(NSError *))failure
{
NSString* path=@"xxxxxxxxxxxxx";
NSMutableDictionary* param=[NSMutableDictionary
dictionary];
param[@"xxx"]=@"";
AFHTTPClient* client=[self
getNsurlRequestPath:path
params:param method:@"post"];
//
上传图片
NSURLRequest* request= [client
multipartFormRequestWithMethod:@"post"
path:path parameters:param
constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// 要上传的图片 以单张图片为例
UIImage *image = [UIImage
imageNamed:@"image_test"];
NSData *data =
UIImageJPEGRepresentation(image, 0.7);
while (data.length >
1024 * 500) {
// 压缩小于 500 k
image = [[UIImage
alloc] initWithData:data];
data = UIImageJPEGRepresentation(image,
0.07);
}
// 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
//
要解决此问题,
// 可以在上传时使用当前的系统事件作为文件名
NSDateFormatter *formatter = [[NSDateFormatter
alloc]
init];
//
设置时间格式
formatter.dateFormat =
@"yyyyMMddHHmmss";
NSString *str = [formatter
stringFromDate:[NSDate
date]];
NSString *fileName = [NSString
stringWithFormat:@"%@.png", str];
[formData appendPartWithFileData:data
name:@"file"
fileName:fileName mimeType:@"image/png"];
}];
AFHTTPRequestOperation* operation=[[AFHTTPRequestOperation
alloc]
initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation,
id responseObject) {
NSDictionary *JSON = [NSJSONSerialization
JSONObjectWithData:operation.responseData
options:NSJSONReadingMutableContainers
error:nil];
if ([JSON[@"code"]
integerValue] != 0) {
NSError* error=[[NSError
alloc] initWithDomain:JSON[@"msg"]
code:[JSON[@"code"]
integerValue] userInfo:@{@"msg" : JSON[@"msg"]}];
if (failure) {
failure(error);
return ;
}
}
if (success) {
success();
}
} failure:^(AFHTTPRequestOperation *operation,
NSError *error) {
if (failure) {
failure(error);
}
}];
/**
@param bytesWritten
每次写进的字节数
@param totalBytesWritten
总共写进的字节数
@param totalBytesExpectedToWrite
期望写进的字节数
*/
__block NSString* total=nil;
__block NSString* totalExpect=nil;
[operation setUploadProgressBlock:^(NSUInteger bytesWritten,
long long totalBytesWritten,
long long totalBytesExpectedToWrite) {
total=[NSString
stringWithFormat:@"%lld",totalBytesWritten ];
totalExpect=[NSString
stringWithFormat:@"%lld",totalBytesExpectedToWrite ];
// 监听上传进度
CGFloat progress =[total
floatValue] / [totalExpect floatValue] ;
NSLog(@"---%f",progress);
NSLog(@"Sent %d
总共 %lld of %lld bytes",bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
}];
// 执行操作
[client.operationQueue
addOperation:operation];
}
(2) AFN 3.1.0 上传图片
1.设置请求头
+(AFHTTPSessionManager*) sessionManager
{
AFHTTPSessionManager* sessinManager=[[AFHTTPSessionManager alloc] initWithBaseURL:[NSURLURLWithString:kBaseURL]];
sessinManager.responseSerializer=[AFJSONResponseSerializer serializer];
// 设置请求头
[sessinManager.requestSerializer setValue:xxx forHTTPHeaderField:@"xxx"];
[sessinManager.requestSerializer setValue:xxx forHTTPHeaderField:@"xxxx"];
// 时间戳
NSString *timeInterval = [NSString stringWithFormat:@"%f",[[NSDate date] timeIntervalSince1970]];
[sessinManager.requestSerializer setValue:timeInterval forHTTPHeaderField:@"r"];
NSString* passWord= [EncryPtionTool GetMd5String:[NSStringstringWithFormat:@"xxx%@%@",timeInterval,kKey]];
[sessinManager.requestSerializer setAuthorizationHeaderFieldWithUsername:kAppName password:passWord];
sessinManager.requestSerializer.timeoutInterval=5.0;
return sessinManager;
}
2.发送请求
+(void)downUpImageSuccess:(void
(^)(NSDictionary *))success failure:(void (^)(NSError
*))failure
{
AFHTTPSessionManager* sessionManager= [self
sessionManager];
NSString* path=@"xxxxxx";
NSMutableDictionary* param=[NSMutableDictionary
dictionary];
param[@"xxxx"]=@"";
[sessionManager POST:path
parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData>
_Nonnull formData) {
/***** 在这里直接添加上传的图片 *****/
UIImage *image = [UIImage
imageNamed:@"image_test"];
NSData *data =
UIImagePNGRepresentation(image);
// 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
//
要解决此问题,
// 可以在上传时使用当前的系统事件作为文件名
NSDateFormatter *formatter = [[NSDateFormatter
alloc]
init];
//
设置时间格式
formatter.dateFormat =
@"yyyyMMddHHmmss";
NSString *str = [formatter
stringFromDate:[NSDate
date]];
NSString *fileName = [NSString
stringWithFormat:@"%@.png", str];
[formData appendPartWithFileData:data
name:@"file"
fileName:fileName mimeType:@"image/png"];
} progress:^(NSProgress *
_Nonnull uploadProgress) {
// 获取上传进度
} success:^(NSURLSessionDataTask *
_Nonnull task, id
_Nullable JSON) {
if ([JSON[@"code"]
integerValue] !=
0) { // 返回 code
值不为 0
NSError* error=[[NSError
alloc] initWithDomain:JSON[@"msg"]
code:[JSON[@"code"]
integerValue] userInfo:@{@"msg" : JSON[@"msg"]}];
failure(error);
return ;
}
NSLog(@"上传成功");
} failure:^(NSURLSessionDataTask *
_Nullable task,
NSError * _Nonnull error) {
NSLog(@"上传失败");
failure(error);
}];
}
由上面可以看到, AFN 3.1.0 对 NSURLSession 封装,除了性能更优,相对以前,代码更集中,更易处理.
相关文章推荐
- 网络编程--JAVA之多线程下载后续:断点续存
- opencv-ios开发笔记7 神经网络 分类器
- IPC网络高清摄像机基础知识0(TI 海思 安霸方案分析“来自2014年”)
- 浅谈HTTP中Get与Post的区别
- 【Android】WebView加载https页面不能正常显示资源问题
- Retrofit请求数据对错误以及网络异常的处理
- 本博客正式迁移到独立站点 http://blog.scjia.cc/
- iOS 应用完全支持 IPv6-ONLY 网络
- HTTP基础:URL格式、 HTTP请求、响应、消息
- iOS_直播类app_HTTP Live Streaming
- 一次http完整的请求tcp报文分析
- Redis repl-disable-tcp-nodelay配置
- 关于 Android 5.0 原生系统网络图标上的感叹号问题解决方法
- 网络请求报错
- 虚拟机,网络模式简介及桥接模式设置
- 网络支付发红包将实名认证
- 请问HTTP 错误 403.9 - 禁止访问:…
- jmeter 建立一个网络服务的测试计划
- HTTP返回代码代表的含义(403,404,500,502,504)
- android判断网络是否可用方法