ios开发网络学习十二:NSURLSession实现文件上传

摘要:
#import"ViewController.h"//----WebKitFormBoundaryvMI3CAV0sGUtL8tr#defineKboundary@"----WebKitFormBoundaryjv0UfA04ED44AhWx"#defineKNewLine[@""dataUsingEncoding:NSUTF8StringEncoding]@interfaceViewContro
#import "ViewController.h"
//----WebKitFormBoundaryvMI3CAV0sGUtL8tr
#define Kboundary @"----WebKitFormBoundaryjv0UfA04ED44AhWx"

#define KNewLine [@"
" dataUsingEncoding:NSUTF8StringEncoding]

@interface ViewController ()<NSURLSessionDataDelegate>
/** 注释 */@property (nonatomic, strong) NSURLSession *session;
@end

@implementationViewController

-(NSURLSession *)session
{
    if (_session ==nil) {
        NSURLSessionConfiguration *config =[NSURLSessionConfiguration defaultSessionConfiguration];
        
        //是否运行蜂窝访问
        config.allowsCellularAccess =YES;
        config.timeoutIntervalForRequest = 15;
        
        _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    }
    return_session;
}

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

-(void)upload
{
    //1.url
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
    
    //2.创建请求对象
    NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:url];
    
    //2.1 设置请求方法
    request.HTTPMethod = @"POST";

    //2.2 设请求头信息
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary] forHTTPHeaderField:@"Content-Type"];
    
    //3.创建会话对象
//NSURLSession *session = [NSURLSession sharedSession];
    
    //4.创建上传TASK
    /*第一个参数:请求对象
     第二个参数:传递是要上传的数据(请求体)
     第三个参数:
     */NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithRequest:request fromData:[self getBodyData] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError *_Nullable error) {
       
       //6.解析
       NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];
    
    //5.执行Task
[uploadTask resume];
}

-(void)upload2
{
    //1.url
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
    
    //2.创建请求对象
    NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:url];
    
    //2.1 设置请求方法
    request.HTTPMethod = @"POST";
    
    //2.2 设请求头信息
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary] forHTTPHeaderField:@"Content-Type"];
    
    //3.创建会话对象
    
    //4.创建上传TASK
    /*第一个参数:请求对象
     第二个参数:传递是要上传的数据(请求体)
     */NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithRequest:request fromData:[self getBodyData] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError *_Nullable error) {
        
        //6.解析
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];
    
    //5.执行Task
[uploadTask resume];
}

-(NSData *)getBodyData
{
    NSMutableData *fileData =[NSMutableData data];
    //5.1 文件参数
    /*--分隔符
     Content-Disposition: form-data; name="file"; filename="Snip20160225_341.png"
     Content-Type: image/png(MIMEType:大类型/小类型)
     空行
     文件参数
     */[fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    
    //name:file 服务器规定的参数
    //filename:Snip20160225_341.png 文件保存到服务器上面的名称
    //Content-Type:文件的类型
    [fileData appendData:[@"Content-Disposition: form-data; name="file"; filename="Sss.png""dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:[@"Content-Type: image/png"dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:KNewLine];
    
    UIImage *image = [UIImage imageNamed:@"Snip20160226_90"];
    //UIImage --->NSData
    NSData *imageData =UIImagePNGRepresentation(image);
    [fileData appendData:imageData];
    [fileData appendData:KNewLine];
    
    //5.2 非文件参数
    /*--分隔符
     Content-Disposition: form-data; name="username"
     空行
     123456
     */[fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:[@"Content-Disposition: form-data; name="username""dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:KNewLine];
    [fileData appendData:[@"123456"dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    
    //5.3 结尾标识
    /*--分隔符--
     */[fileData appendData:[[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    returnfileData;
}

#pragma mark ----------------------
#pragma mark NSURLSessionDataDelegate
/**  @param bytesSent                本次发送的数据
 *  @param totalBytesSent           上传完成的数据大小
 *  @param 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);
}
@end

#####7 NSURLSession实现文件上传

(1)实现文件上传的方法

```objc

/*

第一个参数:请求对象

第二个参数:请求体(要上传的文件数据)

block回调:

NSData:响应体

NSURLResponse:响应头

NSError:请求的错误信息

*/

NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:data completionHandler:^(NSData * __nullable data, NSURLResponse * __nullable response, NSError * __nullable error)

```

(2)设置代理,在代理方法中监听文件上传进度

```objc

/*

调用该方法上传文件数据

如果文件数据很大,那么该方法会被调用多次

参数说明:

totalBytesSent:已经上传的文件数据的大小

totalBytesExpectedToSend:文件的总大小

*/

-(void)URLSession:(nonnull NSURLSession *)session task:(nonnull NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend

{

NSLog(@"%.2f",1.0 * totalBytesSent/totalBytesExpectedToSend);

}

```

(3)关于NSURLSessionConfiguration相关

01 作用:可以统一配置NSURLSession,如请求超时等

02 创建的方式和使用

```objc

//创建配置的三种方式

+ (NSURLSessionConfiguration *)defaultSessionConfiguration;

+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration;

+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier NS_AVAILABLE(10_10, 8_0);

//统一配置NSURLSession

-(NSURLSession *)session

{

if (_session == nil) {

//创建NSURLSessionConfiguration

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

//设置请求超时为10秒钟

config.timeoutIntervalForRequest = 10;

//在蜂窝网络情况下是否继续请求(上传或下载)

config.allowsCellularAccess = NO;

_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];

}

return _session;

}

```

免责声明:文章转载自《ios开发网络学习十二:NSURLSession实现文件上传》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NodePad++的使用笔记每秒处理请求数和并发的关系下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

php SESSION入库的实现

session入库,就是重写session制机,在session的周期内,获得到session的数据并记录到数据库  Session默认是存放到服务器上的文件中,不方便管理,如果能把session存放到数据库中就可以方便的对数据库进行管理了 比如: session入库可以解决哪些问题? 1.      可以解决跨域操作 2.      可以实现单点登陆 3...

Hibernate-入门教程

首先了解hibernate的目录结构 . +lib antlr.jar cglib-full.jar asm.jar asm-attrs.jars commons-collections.jar commons-logging.jar ehcache.jar hibernate3.jar jta....

IOS开发:官方自带的JSON使用

apple在ios5的时候提供了json的相关处理api,其中最主要的是NSJSONSerialization类。 1 + (BOOL)isValidJSONObject:(id)obj; 2 3 + (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:...

Flask入门之SQLAlchemy数据库连接操作(第15讲)

一、库安装 Flask-SQLAlchemy 2 SQLAlchemy 1.0.8 二、进入venv 三、切换到项目Sample 文件夹,进入manager.py 的shell python manager.py shell 四、创建data.sqlite数据库 from app import db from app import mod...

oracle查询连接数、并发数、共享池大小

1、查看当前数据库建立的会话情况: select sid,serial#,username,program,machine,status from v$session; 2、查询数据库当前进程的连接数: select count(*) from v$process; 3、查看数据库当前会话的连接数: select count(*) from v$sessi...

keycloak~自定义rest接口

rest资源 对于我们集成keycloak来说,你可能会遇到它没有实现的功能,这时需要对kc进行扩展,资源的扩展是其中一个方面,它需要实现RealmResourceProvider和RealmResourceProviderFactory两个接口,然后在KC启动之后,它可以被注册到IOC容器里,方便以后我们直接使用。 KC里的扩展是开闭原则OCP的完美体现...