------------------------------------- 01 POST上传单个文件 ---------------------------------------*/
#define kBoundary @"boundary" 可随意定义字符串作为边界标识
重点:1.单个文件上传(四个步骤) 2.设置请求体格式
{
为什么要上传文件:
- 以前很多服务器对上传文件的大小有限制,PHP 限制是 2M
- 目前很多服务器不仅不限制大小,而且鼓励上传多个文件!
- 云服务器的普及!
- 软件商希望获得更多的用户数据!
提示:abc 的目录是用来保存上传文件的,需要设置访问权限!
<1> 文件上传使用 POST 方法.
// 请求为可变请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 制定请求方法为 POST
request.HTTPMethod = @"POST";
<2> 设置请求头,告诉服务器请求体中的内容包含文件参数.
[request setValue:@"multipart/form-data; boundary=kBoundary" forHTTPHeaderField:@"Content-Type"];
使用 NSMutableData 把每个字符串装换成 二进制数据拼接起来
<3> 设置请求体(注意:必须严格按照格式设置).
{
// 上边界
--boundary\r\n
Content-Disposition: form-data; name=userfile; filename=555\r\n
Content-Type: application/json\r\n\r\n
文件内容的二进制数据
NSData * data = [NSdata dataWIthContentOfFIle: filePath ];
// 下边界
\r\n--boundary--
注意1:请求体内容分为三个部分:
* 上边界部分,告诉服务器要做数据上传,包含了服务器的接收字段name=userfile,文件在服务器中保存的名称filename=555,以及上传文件的数据类型 application/json(需要严格按照字符串格式来设置)
* 上传文件的数据部分(二进制数据)
* 下边界部分,严格按照字符串格式来设置.
上边界部分和下边界部分的字符串,最后都要转换成二进制数据,和文件部分的二进制数据拼接在一起,作为请求体发送给服务器.
注意2:
* userfile => 负责上传文件脚本中的 字段名,开发的时候,可以咨询后端程序员
* filename => 将文件保存在服务器上的文件名称
* Content-Type: 客户端告诉服务器上传文件的文件类型
注意3:
* 每一行末尾需要有一定的 \r\n
* 提示:有些服务器可以直接使用 \n,但是新浪微博如果使用 \n 上传文件,服务器会返回“没有权限”的错误!
}
<4> 发送请求(用 NSURLConnection异步发送请求)
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//
NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
}];
}
-
- -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
- {
-
-
- NSString * urlStr=@"http://127.0.0.1/upload/upload.php";
-
- NSURL * url=[NSURL URLWithString:urlStr];
-
- NSMutableURLRequest * request=[NSMutableURLRequest requestWithURL:url];
-
-
- request.HTTPMethod=@"POST";
-
-
-
-
-
- NSString * type=[NSString stringWithFormat:@"multipart/form-data; boundary=%@",kBoundary];
-
- [request setValue:type forHTTPHeaderField:@"Content-Type"];
-
-
-
- request.HTTPBody=[self getHttpBody];
-
-
- [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
-
- NSString * msg=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
- NSLog(@"%@",msg);
-
- }] resume];
-
- }
-
-
-
- -(NSData *)getHttpBody
- {
-
- NSMutableData * data=[NSMutableData data];
-
-
- NSString * path=[NSString stringWithFormat:@"/Users/yangwenleimac/Desktop/学习网站.rtf"];
-
- NSString * filePath=[NSString stringWithFormat:@"file://%@",path];
-
-
- filePath=[filePath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
-
-
-
- NSURL * fileUrl=[NSURL URLWithString:filePath];
-
- NSURLRequest * fileRequest=[NSURLRequest requestWithURL:fileUrl];
-
- NSURLResponse * response=nil;
-
- [NSURLConnection sendSynchronousRequest:fileRequest returningResponse:&response error:NULL];
-
-
- NSLog(@"%@,%@",response.suggestedFilename,response.MIMEType);
-
-
-
- NSString * suggestedFileName= [path lastPathComponent];
-
-
-
-
-
-
- NSMutableString * headerStr=[NSMutableString stringWithFormat:@"--%@\r\n",kBoundary];
-
- [headerStr appendFormat:@"Content-Disposition: form-data; name=%@; filename=%@\r\n",@"userfile",@"11111"];
-
- [headerStr appendFormat:@"Content-Type: %@\r\n\r\n",response.MIMEType];
-
- [data appendData:[headerStr dataUsingEncoding:NSUTF8StringEncoding]];
-
- NSData * fileData=[NSData dataWithContentsOfFile:path];
-
- [data appendData:fileData];
-
-
-
- NSMutableString * footerStr=[NSMutableString stringWithFormat:@"\r\n--%@--",kBoundary];
-
- [data appendData:[footerStr dataUsingEncoding:NSUTF8StringEncoding]];
-
- return data;
-
- }