NSURLSession的文件上传
文件上传的步骤:
(1)确定上传路径
(2)创建“可变”请求对象
(3)修改请求方法为POST
--设置请求头信息,告诉服务器这是一个文件上传请求
--按照固定的格式拼接数据
(4)设置请求体信息(文件参数)
(5)创建会话对象
(6)根据会话对象来创建uploadTask
(7)执行task发送请求上传文件
代码示例如下:
需要注意的是:拼接的数据是必须按照格式拼接,否则会报错。
#import "ViewController.h" #define kBoundary @"----WebKitFormBoundaryXGAyMbuVkeaFc916" #define kNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding] @interface ViewController () @end @implementation ViewController - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { // (1)确定上传路径 NSURL *url = [NSURL URLWithString:@"http://mbs.test.internet.zhiwangyilian.com/api/files/upload"]; //(2)创建“可变”请求对象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //(3)修改请求方法为POST request.HTTPMethod = @"POST"; // --设置请求头信息,告诉服务器这是一个文件上传请求 //Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXGAyMbuVkeaFc916 [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", kBoundary] forHTTPHeaderField:@"Content-Type"]; //--按照固定的格式拼接数据 ----这个放在bodyData中拼接 //(4)设置请求体信息(文件参数) ----这个放在bodyData中拼接 //(5)创建会话对象 NSURLSession *session = [NSURLSession sharedSession]; //(6)根据会话对象来创建uploadTask /** 第一个参数:请求对象 第二个参数:本应该放在请求体中的信息,如果放在请求头中,会被忽略 */ NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:[self bodyData] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSLog(@"---%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); }]; //(7)执行task发送请求上传文件 [uploadTask resume]; } - (NSData *)bodyData { NSMutableData *data = [NSMutableData data]; //01 拼接文件参数 /** --分隔符 Content-Disposition: form-data; name="file"; filename="22e93acbcced42dbb319a2fc0ecdcec9.jpg" Content-Type: image/jpeg 空行 文件数据 --分隔符-- */ [data appendData:[[NSString stringWithFormat:@"--%@",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; [data appendData:kNewLine]; //name=file,其中file是不能随便写的,服务器要求写什么就写什么 [data appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"22e93acbcced42dbb319a2fc0ecdcec9.jpg\"" dataUsingEncoding:NSUTF8StringEncoding]]; [data appendData:kNewLine]; //要上传文件的而进士数据类型,组成:大类型/小类型 [data appendData:[@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding]]; [data appendData:kNewLine]; [data appendData:kNewLine]; NSData *imageData = [NSData dataWithContentsOfFile:@"/Users/gao/Desktop/图片/课程图片/61149b0491243c749fc871e67550a7f6.png"]; [data appendData:imageData]; [data appendData:kNewLine]; //02 拼接非文件参数--如果有非文件的数据,就加上这个拼接的格式 /** --分隔符 Content-Dispositon: form-data; name="useruame" 空行 abcdf(输入的内容) */ [data appendData:[[NSString stringWithFormat:@"--%@",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; [data appendData:kNewLine]; [data appendData:[@"Content-Dispositon: form-data; name=\"useruame\"" dataUsingEncoding:NSUTF8StringEncoding]]; [data appendData:kNewLine]; [data appendData:kNewLine]; [data appendData:[@"abscdd" dataUsingEncoding:NSUTF8StringEncoding]]; [data appendData:kNewLine]; //03 结尾表示 [data appendData:[[NSString stringWithFormat:@"--%@--",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; return data; } @end