iOS的info.plist文件配置
一.使用DataTask上传
#import "ViewController.h"
#define kBoundary @"AaB03x"
#define kNext @"\r\n"
#define kStart @"--AaB03x"
#define kEnd @"--AaB03x--"
#define DataFromString(str) ([str dataUsingEncoding:NSUTF8StringEncoding])
@interface ViewController ()<NSURLSessionDataDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建url
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/upLoadFile.php"];
//2.创建可变的request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
[request setValue:@"multipart/form-data,boundary=AaB03x" forHTTPHeaderField:@"Content-type"];
//3.创建可变的body
NSMutableData *bodyData = [NSMutableData data];
#pragma mark -------开始拼接 ---------
//1.请求体的开始 --AaB03x
[bodyData appendData:DataFromString(kStart)];
//2.换行
[bodyData appendData:DataFromString(kNext)];
//3.设置数据对应的字段
[bodyData appendData:DataFromString(@"content-disposition:form-data;name= \"file\";filename=\"def.png\"")];
//4.换行
[bodyData appendData:DataFromString(kNext)];
//5.设置文件的类型image/png image/jpeg video/mp4
[bodyData appendData:DataFromString(@"content-Type:image/png")];
//6.换行
[bodyData appendData:DataFromString(kNext)];
//7.换行 真正的数据开始
[bodyData appendData:DataFromString(kNext)];
//获取图片的二进制数据
NSData *imgData = UIImagePNGRepresentation([UIImage imageNamed:@"bz"]);
//8.设置数据
[bodyData appendData:imgData];
//9.换行 设置数据完毕
[bodyData appendData:DataFromString(kNext)];
//10.请求体的结束 --AaB03x
[bodyData appendData:DataFromString(kEnd)];
//11.换行
[bodyData appendData:DataFromString(kNext)];
#pragma mark -------拼接结束 ---------
//4.设置请求体
request.HTTPBody = bodyData;
//5.创建session
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
// 5.创建task
NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
// 6.开启任务
[task resume];
}
#pragma mark -------代理方法 ---------
//上传的信息
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend{
NSLog(@"%f",totalBytesSent*1.0/totalBytesExpectedToSend);
}
//上传完毕
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
NSLog(@"%@",error.userInfo);
}
@end
二.使用UploadTask上传
2.1.步骤:
2.2.代码例子:
#import "ViewController.h"
#define kBoundary @"AaB03x"
#define kNext @"\r\n"
#define kStart @"--AaB03x"
#define kEnd @"--AaB03x--"
#define DataFromString(str) ([str dataUsingEncoding:NSUTF8StringEncoding])
@interface ViewController ()<NSURLSessionDataDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建url
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/AF_UpLoadFile.php"];
//2.创建可变的request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
[request setValue:@"multipart/form-data,boundary=AaB03x" forHTTPHeaderField:@"Content-type"];
//3.创建可变的body
NSMutableData *bodyData = [NSMutableData data];
#pragma mark -------开始拼接 ---------
//1.请求体的开始 --AaB03x
[bodyData appendData:DataFromString(kStart)];
//2.换行
[bodyData appendData:DataFromString(kNext)];
//3.设置数据对应的字段
[bodyData appendData:DataFromString(@"content-disposition:form-data;name= \"file\";filename=\"abc.png\"")];
//4.换行
[bodyData appendData:DataFromString(kNext)];
//5.设置文件的类型image/png image/jpeg video/mp4
[bodyData appendData:DataFromString(@"content-Type:image/png")];
//6.换行
[bodyData appendData:DataFromString(kNext)];
//7.换行 真正的数据开始
[bodyData appendData:DataFromString(kNext)];
//获取图片的二进制数据
NSData *imgData = UIImagePNGRepresentation([UIImage imageNamed:@"def"]);
//8.设置数据
[bodyData appendData:imgData];
//9.换行 设置数据完毕
[bodyData appendData:DataFromString(kNext)];
//10.请求体的结束 --AaB03x
[bodyData appendData:DataFromString(kEnd)];
//11.换行
[bodyData appendData:DataFromString(kNext)];
#pragma mark -------拼接结束 ---------
//4.设置请求体
request.HTTPBody = bodyData;
//5、创建NSURLSession
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//6、创建上传任务 上传的数据来自getData方法
NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:bodyData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"响应信息:%@",[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
}];
//7、执行上传任务
[task resume];
}
#pragma mark - 代理方法 只要给服务器上传数据就会调用 可以计算出上传进度
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend{
NSLog(@"%f",totalBytesSent*1.0/totalBytesExpectedToSend);
}
@end
参考文章
https://www.jianshu.com/p/f0a9c47167fd
https://blog.csdn.net/majiakun1/article/details/38133789
demo链接
链接:https://pan.baidu.com/s/1oUxNWJhaj69228XVGmtPWA 密码:rafj
链接:https://pan.baidu.com/s/15ONw7XccbEkVnwLhAItkww 密码:6ssf