NSURLSession笔记(四)上传图片

原创 2015年07月08日 17:38:41

这个例子,还是以新浪微博为例。

首先在宏定义出POST请求头的一个属性:请求体边界,它是干什么用的呢,先别急,往下看

#define boundary @"AaB03x" //设置边界 参数可以随便设置

//1.构建URL
NSURL *url=[NSURL URLWithString:@"https://api.weibo.com/2/statuses/upload.json"];

//2.创建request请求
//NSURLRequest *request=[NSURLRequest requestWithURL:url];
//NSURLRequest 不可变的 NSMutableURLRequest可变的 可以设置请求属性
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];

//(1)请求模式(默认是GET)
[request setHTTPMethod:@"POST"];
//(2)超时时间
[request setTimeoutInterval:120];
//(3)缓存策略
[request setCachePolicy:NSURLRequestReturnCacheDataElseLoad];

//(4)请求头
//以下代码是关键
//upload task不会在请求头里添加content-type(上传数据类型)字段
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; charset=utf-8;boundary=%@", boundary];
[request setValue:contentType forHTTPHeaderField:@"Content-Type"];

//[request setValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>]
//[request addValue:<#(NSString *)#> forHTTPHeaderField:<#(NSString *)#>]
//[request setAllHTTPHeaderFields:<#(NSDictionary *)#>]

//(5)设置请求体
//发送的微博需要这2个参数
//access_token(微博令牌,根据用户名,密码生成的明文密码) status(微博内容)
//pic (图片) ----因为图片转成字符串编码量太大如果直接拼接在URL里服务器无法识别其请求,所以要把图片数据放在请求体里

//本地图片
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Icon.png" ofType:nil];
//拼接请求体
NSData *bodyData=[self setBodydata:filePath];(注意上面宏定义的请求体边界下面就要用上了)

//3.创建网络会话
NSURLSession *session=[NSURLSession sharedSession];

//4.创建网络上传任务
NSURLSessionUploadTask *dataTask=[session uploadTaskWithRequest:request fromData:bodyData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error == nil) {

NSLog(@"%@",response);//202及是发布成功
};
}];

//5.发送网络任务
[dataTask resume];


//————————————————————————————POST请求体格式——————————————————————————————

//这个格式比较繁琐,但是这是死格式,大家耐心看,就可以看出规律了。注意看红字分析

//---->拼接成字符串,然后转成 NSData 返回

/*
HTTP请求头:
....
multipart/form-data; charset=utf-8;boundary=AaB03x //上传数据类型 必须要设置其类型
....


HTTP请求体:

--AaB03x (边界到下一行用了换行,在oc里面 用 \r\n 来定义换一行 所以下面不要奇怪它的用法)
Content-Disposition: form-data; name="key1"(这行到 value1 换了2行,所以,自然而然 \r\n\r\n )

value1
--AaB03x
Content-disposition: form-data; name="key2"

value2
--AaB03x
Content-disposition: form-data; name="key3"; filename="file"
Content-Type: application/octet-stream

图片数据...//NSData
--AaB03x--(结束的分割线也不要落下)
*/

- (NSData *)setBodydata:(NSString *)filePath
{
//把文件转换为NSData
NSData *fileData = [NSData dataWithContentsOfFile:filePath];

//1.构造body string
NSMutableString *bodyString = [[NSMutableString alloc] init];

//2.拼接body string
//(1)access_token
[bodyString appendFormat:@"--%@\r\n", boundary];(一开始的 --也不能忽略)
[bodyString appendFormat:@"Content-Disposition: form-data; name=\"access_token\"\r\n\r\n"];
[bodyString appendFormat:@"xxxxxx\r\n"];

//(2)status
[bodyString appendFormat:@"--%@\r\n", boundary];
[bodyString appendFormat:@"Content-Disposition: form-data; name=\"status\"\r\n\r\n"];
[bodyString appendFormat:@"带图片的微博\r\n"];

//(3)pic
[bodyString appendFormat:@"--%@\r\n", boundary];
[bodyString appendFormat:@"Content-Disposition: form-data; name=\"pic\"; filename=\"file\"\r\n"];
[bodyString appendFormat:@"Content-Type: application/octet-stream\r\n\r\n"];


//3.string --> data
NSMutableData *bodyData = [NSMutableData data];
//拼接的过程
//前面的bodyString, 其他参数
[bodyData appendData:[bodyString dataUsingEncoding:NSUTF8StringEncoding]];
//图片数据
[bodyData appendData:fileData];

//4.结束的分隔线
NSString *endStr = [NSString stringWithFormat:@"\r\n--%@--\r\n",boundary];
//拼接到bodyData最后面
[bodyData appendData:[endStr dataUsingEncoding:NSUTF8StringEncoding]];

return bodyData;
}

如此,带图片的微博就完成了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS开发 ----- 网络请求5 ----- NSURLsession实现上传数据

NSURLSession上传数据前边写的是用AFNetWorking实现的上传,当时还比较懵逼,不知道自己怎么上传,今天又详细分析了一下,又扒了几篇博客,现在已经实现了自己上传,下边先说下原理1. 上...
  • xiao333ma
  • xiao333ma
  • 2015年09月28日 13:24
  • 1915

ios NSURLSession 来请求图片和json数据

先上图: 以下的两个demo都用到了我基于NSURLSession来封装的一个网络请求的block(后面附录TFNetWorkManager源码) 一. 利用NSURLSession来增量下载...
  • robinson_911
  • robinson_911
  • 2016年09月16日 12:29
  • 579

IOS 网络开发NSURLSession(四)UploadTask(上传数据+图片)

原创blog,转载请注明出处 blog.csdn.net/hello_hwc前言: UploadTask继承自DataTask。不难理解,因为UploadTask只不过在Http请求的时候,把数据...
  • Hello_Hwc
  • Hello_Hwc
  • 2015年04月02日 16:15
  • 8881

使用NSURLSession简单做一个上传图片的方法

通常上传文件、图片。使用http请求的POST方法,在body体中还有一些固定的格式。iOS SDK中的NSURLSession是一个heigh-level API,由于上传图片是一次性请求,实现起来...
  • hherima
  • hherima
  • 2017年04月27日 15:45
  • 1199

NSURLSession参数、文件上传实例

-(IBAction)httpGetData:(id)sender{ NSURLSessionConfiguration *config1 = [NSURLSessionConfigurati...
  • daleiwang
  • daleiwang
  • 2016年02月24日 15:36
  • 1852

iOS NSURLSession 实现网络请求-文件下载-上传-后台下载

*  会话NSURLSession     NSURLConnection通过全局状态来管理cookies, 认证信息等公共资源, 如果两个连接需要使用不同的资源配置情况时就无法解决,    ...
  • xy_26207005
  • xy_26207005
  • 2016年06月02日 11:11
  • 8078

JFinal学习笔记(四) 实现简单的图片上传

图片上传是网站开发中非常常用的一个功能,本文将详细描述在jfinal框架下如何实现图片上传功能。 首先我在实现图片上传功能时用到了uploadify插件,因此在开发时需要引入相应的文件,分别是upl...
  • tczhoulan
  • tczhoulan
  • 2015年09月04日 16:07
  • 4816

iOS 开发 NSURLSession使用大全详解(包括请求,上传和断点下载)

NSURLSession基本特点 用于替代 NSURLConnection 支持后台运行的网络任务 暂停、停止、重启网络任务,不再需要 NSOperation 封装 请求可以使用同样的配置容器 直接使...
  • kuangdacaikuang
  • kuangdacaikuang
  • 2016年11月29日 18:57
  • 1203

通过nsurlsession向服务器传送json数据

近几天真是被json搞死了 终于知道该怎么用json向服务器传输json了 直接贴代码吧 //多样性的request let request = NSMutableURLR...
  • qq_31214097
  • qq_31214097
  • 2015年12月26日 20:19
  • 1055

【iOS开发-99】POST四种数据提交方式以及NSURLSession上传任务的一些知识

POST四种数据提交方式以及NSURLSession上传任务的一些知识
  • wsb200514
  • wsb200514
  • 2014年12月26日 14:27
  • 2045
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NSURLSession笔记(四)上传图片
举报原因:
原因补充:

(最多只允许输入30个字)