NSURLSession-上传图片和视频

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 ()

@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.步骤:

NSURLSession-上传图片和视频_第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 ()

@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

你可能感兴趣的:(NSURLSession-上传图片和视频)