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

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

首先在宏定义出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;

}

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

时间: 2024-10-16 09:14:16

NSURLSession(三)POST请求—>上传图片的相关文章

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

*  会话NSURLSession NSURLConnection通过全局状态来管理cookies, 认证信息等公共资源, 如果两个连接需要使用不同的资源配置情况时就无法解决, 这个问题在NSURLSession可以解决, NSURLSession同时对应着多个连接, 会话通过工厂方法来创建, 同一个会话中使用相同的状态信息, NSURLSession支持进程三种会话: 1. defaultSessionConfiguration : 进程内会话 (默认会话), 用来硬盘来缓存数据. 2. ep

NSURLSession 三种方法

NSURLSession总结 No.1.> DataTask 加载数据: get! [[[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){ //可以打开服务器给你传的二进制数据 NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:d

Python框架之Tornado(三)请求

概述 本篇就来详细介绍tornado服务器(socket服务端)是如何接收用户请求数据以及如果根据用户请求的URL处理并返回数据,也就是上图的3系列所有步骤,如上图[start]是一个死循环,其中利用epoll监听服务端socket句柄,一旦客户端发送请求,则立即调用HttpServer对象的_handle_events方法来进行请求的处理. 对于整个3系列按照功能可以划分为四大部分: 获取用户请求数据(上图3.4) 根据用户请求URL进行路由匹配,从而使得某个方法处理具体的请求(上图3.5-3

NSURLSession(一)GET请求

//GET请求, 也可以给服务器发送信息, 也有参数(微博用户名,用户id) //1.构造URL, 参数直接拼接在url连接后 NSURL *url = [NSURL URLWithString:@"http://news-at.zhihu.com/api/3/news/4602734"]; //2.构造Request //把get请求的请求头保存在request里 //NSURLRequest *request = [NSURLRequest requestWithURL:url];

NSURLSession(二)POST请求

//1.构造URL NSURL *url = [NSURL URLWithString:@"https://api.weibo.com/2/statuses/update.json"]; //2.构造Request NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //(1)设置为POST请求 [request setHTTPMethod:@"POST"]; //(2)超

C# 通过http post 请求上传图片和参数

一.C# Winform或控制台 /// <summary> /// 通过http上传图片及传参数 /// </summary> /// <param name="imgPath">图片地址(绝对路径:D:\demo\img\123.jpg)</param> public void UploadImage(string imgPath) { var uploadUrl = "http://localhost:3020/uploa

Xcode7 使用NSURLSession发送HTTP请求的问题

错误描述: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app’s Info.plist file. 在iOS9 中,苹果将原http协议改成了https协议,使用 TLS1.2 SSL加密请求数据. 解决方法: 在info.plist 加入key <

2017.3.31 spring mvc教程(三)请求映射(静态文件访问、拦截器)

学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变化比较大的功能. spring mvc教程(三)拦截器 1.Spring中的拦截器 (1)拦截器接口 Spring提供了拦截器接口.实现这个接口或继承这个类,就能实现自己的拦截器. 1 org.springframework.web.servlet.HandlerInterceptor接口 2 or

web前端 ajax请求上传图片数据类型处理

form: function (url, paras, files, success) {//上传的文件类型是MultipartFile[]//如果把需要的参数直接传入,则会请求错误//设置请求参数的数据类型 var urlStr = UrlParas(url, paras).url; console.log(urlStr) var formData = new FormData(); for (var item in paras) { formData.append(item, paras[i