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;
}

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

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

相关文章推荐

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

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

NSURLSession(三)POST请求—>上传图片

这个例子,还是以新浪微博为例。 首先在宏定义出POST请求头的一个属性:请求体边界,它是干什么用的呢,先别急,往下看 #define boundary @"AaB03x" //设置边界 参...

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

原创blog,转载请注明出处 blog.csdn.net/hello_hwc前言: UploadTask继承自DataTask。不难理解,因为UploadTask只不过在Http请求的时候,把数据...

springMVC学习笔记---day04-上传图片、JSON转对象、校验、全局异常、拦截器、静态资源

一:使用springmvc上传图片 二:JSON和对象之间的相互转化 三:springmvc的校验 四:restful风格的开发 五:全局异常处理

springmvc学习笔记(17)-上传图片

本文展示如何在springmvc中上传图片

J2EE学习笔记——JSP使用Fckeditor 上传图片

首先需要下载     FCKidetor  所用的文件  和相关 jar 包     并导入,    在这里下载            &#...

android学习笔记----解决android有的手机拍照后上传图片被旋转的问题

第一种解决方式,当手机拍照结束,在返回结果处理里面立即跳转到一个新的页面,在新的页面里让用户自己手动去旋转图片,然后点击确定。就可以上传到服务器正着的图片了;第二种解决方式,这是在论坛里发现的一个方法...

php 之跨域上传图片 (smallnews笔记)

因为要将所有上传的图片上传到一台独立的图片服务器上面,js上传时存在跨域问题,网上找到这种,通过php curl方式,将图片重新发送到另外一台服务器上保存,并返回图片路径! 这种方式存在一定...

我的编程笔记-asp.net批量上传图片

前几天做了批量上传图片的功能,看似简单,其实也不简单,主要还是细节! 先看图 文字说明的textbox经过了处理然后支持了工具栏                  var editor1; ...

微信小程序开发—(四)上传图片

一.了解wx.chooseImage(OBJECT) 二.代码编程 在pages文件里面创建uploadimg文件夹 1.编写页面结构:uploadimg.wxml 获取图片 2...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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