NSURLSessionUploadTask 上传文件
1.创建NSURLSessionUploadTask和NSURLSession
-(void)upload
{
NSURL *url = [NSURL URLWithString:@"上传路径"];
//创建"可变"请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//设置请求方法
request.HTTPMethod = @"POST";
//+ "设置请求头信息,告诉服务器这是一个文件上传请求"
//Content-Type:multipart/form-data; boundary=--分隔符(不能是中文,并且分隔符要一致)
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",分隔符] forHTTPHeaderField:@"Content-Type"];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//+ "按照固定的格式来拼接数据"
//设置请求体信息(文件参数)
NSData *data = [self bodyData];
NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData: data completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}];
//执行上传文件
[uploadTask resume];
}
2.拼接请求体信息
-(NSData *)bodyData
{
NSMutableData *data = [NSMutableData data];
NSData *knewLine = [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding];
//01 拼接文件参数
/*
--分隔符
Content-Disposition: form-data; name="file"; filename="文件名称"
Content-Type: image/png
空行
文件数据
*/
[data appendData:[[NSString stringWithFormat:@"--%@",分隔符] dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData: knewLine];
//name:file 服务器规定
//filename:该文件上传到服务器之后的名称
//username|pwd
[data appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"文件名称\"" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData: knewLine];
//要上传文件的二进制数据类型 MIMEType 组成:大类型/小类型
[data appendData:[@"Content-Type: image/png" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData: knewLine];
[data appendData: knewLine];
NSData *imageData = [NSData dataWithContentsOfFile:@"上传的文件路径"];
[data appendData:imageData];
[data appendData: knewLine];
//02 拼接非文件参数
/*
--分隔符
Content-Disposition: form-data; name="username"
空行
abcdf
*/
[data appendData:[[NSString stringWithFormat:@"--%@",分隔符] dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData: knewLine];
//name:username
[data appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData: knewLine];
[data appendData: knewLine];
[data appendData:[@"abcdef" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData: knewLine];
//03 结尾标识
/*
--分隔符--
*/
[data appendData:[[NSString stringWithFormat:@"--%@--",分隔符] dataUsingEncoding:NSUTF8StringEncoding]];
return data;
}
3.NSURLSessionDataDelegate
// 监听上传进度
//bytesSent 本次上传文件的数据大小
//totalBytesSent 已经上传文件的总大小
//totalBytesExpectedToSend 文件的总大小
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
{
NSLog(@"%f",1.0 * totalBytesSent / totalBytesExpectedToSend);
}