iOS NSURLSession UploadTask(上传任务)

简介: 1. 简单的上传任务// 上传文件- (void)uploadTask { NSURL *url = [NSURL URLWithString:@"http://127.

1. 简单的上传任务

// 上传文件
- (void)uploadTask {
    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/uploads/123.png"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"put";
    [request setValue:[self getAuth:@"admin" pwd:@"1"] forHTTPHeaderField:@"Authorization"];
//    [request setValue:@"Basic YWRtaW46MQ==" forHTTPHeaderField:@"Authorization"];
    // 本地文件
    NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"head1.png" withExtension:nil];
    [[[NSURLSession sharedSession] uploadTaskWithRequest:request fromFile:fileUrl completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@", str);
    }] resume];
}

// 获取授权的字符串
- (NSString *)getAuth:(NSString *)name pwd:(NSString *)pwd {
    // 拼字符串 admin:1
    NSString *tmpStr = [NSString stringWithFormat:@"%@:%@",name,pwd];
    // base64编码
    tmpStr = [self base64Encode:tmpStr];
    return [NSString stringWithFormat:@"Basic %@", tmpStr];
}

// base64编码
- (NSString *)base64Encode:(NSString *)str {
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    return [data base64EncodedStringWithOptions:0];
}

2. 监听进度的上传

#import "ViewController.h"

@interface ViewController () <NSURLSessionTaskDelegate>
@property (nonatomic, strong) NSURLSession *session;
@end

@implementation ViewController

// 懒加载
- (NSURLSession *)session {
    if (_session == nil) {
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:0];
    }
    return _session;
}

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self uploadTask];
}

// 上传文件,监听进度
- (void)uploadTask {
    
    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/uploads/123.png"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"put";
    [request setValue:[self getAuth:@"admin" pwd:@"1"] forHTTPHeaderField:@"Authorization"];
    // 本地文件
    NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"head1.png" withExtension:nil];
    
    [[self.session uploadTaskWithRequest:request fromFile:fileUrl completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"---%@", str);
    }] resume];
}

#pragma mark - 上传进度代理方法
// 上传进度
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend {
    // 进度 = 已发送的 / 一共需要发送的
    float process = totalBytesSent * 1.0 / totalBytesExpectedToSend;
    NSLog(@"%f", process);
}

// 上传完成
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
    NSLog(@"上传完成");
}

// 获取授权的字符串
- (NSString *)getAuth:(NSString *)name pwd:(NSString *)pwd {
    // 拼字符串 admin:1
    NSString *tmpStr = [NSString stringWithFormat:@"%@:%@",name,pwd];
    // base64编码
    tmpStr = [self base64Encode:tmpStr];
    return [NSString stringWithFormat:@"Basic %@", tmpStr];
}

// base64编码
- (NSString *)base64Encode:(NSString *)str {
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    return [data base64EncodedStringWithOptions:0];
}

@end

3. NSURLSessionConfiguration配置

img_71393a88464ab32194a25bfa80fc18dd.png
NSURLSessionConfigration.png
目录
相关文章
|
4月前
|
调度 Swift Android开发
苹果iOS新手开发之Swift中的并发任务和消息机制
Swift的消息机制类似Android的Handler,实现任务调度有三种方式: 1. **Grand Central Dispatch (GCD)**:使用`DispatchQueue`在主线程或后台线程执行任务。 2. **OperationQueue**:提供高级接口管理`Operation`对象。 3. **RunLoop**:处理事件如输入源、计时器,类似Android的`Looper`和`Handler`。 **示例**: - GCD:在不同线程执行代码块。 - OperationQueue:创建操作并执行。 - RunLoop:用Timer添加到RunLoop中。
100 2
|
iOS开发
iOS开发 GET、POST请求方法:NSURLSession篇
iOS开发 GET、POST请求方法:NSURLSession篇
103 0
|
iOS开发 开发者
iOS 上传APP到AppStore 卡在 Authenticating with the iTunes store 提示
iOS 上传APP到AppStore 卡在 Authenticating with the iTunes store 提示
iOS 上传APP到AppStore 卡在 Authenticating with the iTunes store 提示
|
iOS开发
iOS__上传应用到AppStore出现Authenticating with the iTunes store
iOS__上传应用到AppStore出现Authenticating with the iTunes store
iOS__上传应用到AppStore出现Authenticating with the iTunes store
|
iOS开发 开发者
iOS 上传应用到APPStore 详细版
iOS 上传应用到APPStore 详细版
iOS 上传应用到APPStore 详细版
|
Linux iOS开发 开发者
​【iOS工具】快速上传ipa文件到iTunes Connect​
​【iOS工具】快速上传ipa文件到iTunes Connect​
​【iOS工具】快速上传ipa文件到iTunes Connect​
|
Linux iOS开发 开发者
使用Application 上传iOS App
使用Application 上传iOS App
使用Application 上传iOS App
|
Linux iOS开发 开发者
2022最新最全升级版【精品工具】用Appuploader发布上传iOS APP上架流程简单快速
2022最新最全升级版【精品工具】用Appuploader发布上传iOS APP上架流程简单快速
2022最新最全升级版【精品工具】用Appuploader发布上传iOS APP上架流程简单快速
|
iOS开发
iOS 开发-教大家如何使用github客户端上传自己的代码到github网站
iOS 开发-教大家如何使用github客户端上传自己的代码到github网站
177 0
iOS 开发-教大家如何使用github客户端上传自己的代码到github网站
|
iOS开发
iOS 打包上传-22421错误
iOS 打包上传-22421错误
iOS 打包上传-22421错误