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

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //1.創(chuàng)建url
    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/upLoadFile.php"];
    
    //2.創(chuàng)建可變的request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
    request.HTTPMethod = @"POST";
    
    [request setValue:@"multipart/form-data,boundary=AaB03x" forHTTPHeaderField:@"Content-type"];
    
    //3.創(chuàng)建可變的body
    NSMutableData *bodyData = [NSMutableData data];
  
#pragma mark -------開始拼接 ---------
    //1.請求體的開始 --AaB03x
    [bodyData appendData:DataFromString(kStart)];
    
    //2.換行
    [bodyData appendData:DataFromString(kNext)];
    
    //3.設(shè)置數(shù)據(jù)對應(yīng)的字段
    [bodyData appendData:DataFromString(@"content-disposition:form-data;name= \"file\";filename=\"def.png\"")];
    
    //4.換行
    [bodyData appendData:DataFromString(kNext)];
    
    //5.設(shè)置文件的類型image/png   image/jpeg video/mp4
    [bodyData appendData:DataFromString(@"content-Type:image/png")];
    
    //6.換行
    [bodyData appendData:DataFromString(kNext)];
    
    //7.換行 真正的數(shù)據(jù)開始
    [bodyData appendData:DataFromString(kNext)];
    
    //獲取圖片的二進(jìn)制數(shù)據(jù)
    NSData *imgData = UIImagePNGRepresentation([UIImage imageNamed:@"bz"]);
    
    //8.設(shè)置數(shù)據(jù)
    [bodyData appendData:imgData];
    
    //9.換行 設(shè)置數(shù)據(jù)完畢
    [bodyData appendData:DataFromString(kNext)];
    
    //10.請求體的結(jié)束 --AaB03x
    [bodyData appendData:DataFromString(kEnd)];
    
    //11.換行
    [bodyData appendData:DataFromString(kNext)];
#pragma mark -------拼接結(jié)束 ---------
    
    //4.設(shè)置請求體
    request.HTTPBody = bodyData;
    
    //5.創(chuàng)建session
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
    // 5.創(chuàng)建task
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
    
    // 6.開啟任務(wù)
    [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.創(chuàng)建url
    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/AF_UpLoadFile.php"];
    
    //2.創(chuàng)建可變的request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
    request.HTTPMethod = @"POST";
    
    [request setValue:@"multipart/form-data,boundary=AaB03x" forHTTPHeaderField:@"Content-type"];
    
    //3.創(chuàng)建可變的body
    NSMutableData *bodyData = [NSMutableData data];
    
#pragma mark -------開始拼接 ---------
    //1.請求體的開始 --AaB03x
    [bodyData appendData:DataFromString(kStart)];
    
    //2.換行
    [bodyData appendData:DataFromString(kNext)];
    
    //3.設(shè)置數(shù)據(jù)對應(yīng)的字段
    [bodyData appendData:DataFromString(@"content-disposition:form-data;name= \"file\";filename=\"abc.png\"")];
    
    //4.換行
    [bodyData appendData:DataFromString(kNext)];
    
    //5.設(shè)置文件的類型image/png   image/jpeg video/mp4
    [bodyData appendData:DataFromString(@"content-Type:image/png")];
    
    //6.換行
    [bodyData appendData:DataFromString(kNext)];
    
    //7.換行 真正的數(shù)據(jù)開始
    [bodyData appendData:DataFromString(kNext)];
    
    //獲取圖片的二進(jìn)制數(shù)據(jù)
    NSData *imgData = UIImagePNGRepresentation([UIImage imageNamed:@"def"]);
    
    //8.設(shè)置數(shù)據(jù)
    [bodyData appendData:imgData];
    
    //9.換行 設(shè)置數(shù)據(jù)完畢
    [bodyData appendData:DataFromString(kNext)];
    
    //10.請求體的結(jié)束 --AaB03x
    [bodyData appendData:DataFromString(kEnd)];
    
    //11.換行
    [bodyData appendData:DataFromString(kNext)];
#pragma mark -------拼接結(jié)束 ---------
    
    //4.設(shè)置請求體
    request.HTTPBody = bodyData;
    
    //5、創(chuàng)建NSURLSession
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];


    //6、創(chuàng)建上傳任務(wù) 上傳的數(shù)據(jù)來自getData方法
    NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:bodyData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        
        NSLog(@"響應(yīng)信息:%@",[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
    }];
    
    //7、執(zhí)行上傳任務(wù)
    [task resume];
    
}

#pragma mark - 代理方法 只要給服務(wù)器上傳數(shù)據(jù)就會調(diào)用 可以計算出上傳進(jìn)度
- (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

參考文章
http://www.itdecent.cn/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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容