zoukankan      html  css  js  c++  java
  • 网络篇-NSURLSessionDownloadTask上传

    简述:

    其实使用NSURLSessionDownloadTask上传和NSURLConnection原生上传差不多都是需要拼接,并且也非常麻烦,好了废话不多说,,直接干完这篇就去吃晚饭去了。

    代码:

    • 1、这里的话直接确定了一个大纲,只差拼接了,因为不管怎样首先都是先有URL然后再有请求对象最后在发送请求。
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        //因为文件比较大  我们这里就使用POST了
        //1、确定URL
        NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/upload"];
        //2、确定请求   因为用POST请求,所以这里使用NSMutableURLRequest
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        //2.1、 设置请求方式 post
        request.HTTPMethod = @"POST";
    
        //2.2、请求体我的拼一个会儿........
        //request.HTTPBody = ?;
    
    
    
        //3、 创建NSURLSession
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        //创建Task
        NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:data completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
        }];
        //执行任务
        [task resume];
    }
    
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        //因为文件比较大  我们这里就使用POST了
    
        //1、确定URL
        NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/upload"];
    
        //2、确定请求
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        /******************************************************************/
        //                          设置请求头
        [request setValue:@"multipart/form-data; boundary=----WebKitFormBoundaryUFNaH6losNxu4xDq" forHTTPHeaderField:@"Content-Type"];
    
        /******************************************************************/
        //                          设置请求体
        // 设置请求体
        // 给请求体加入固定格式数据  这里也是使用的也是可变的,因为多嘛
        NSMutableData *data = [NSMutableData data];
        /******************************************************************/
        //                       开始标记
        [data appendData:[@"------WebKitFormBoundaryUFNaH6losNxu4xDq" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"
    " dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"Content-Disposition: form-data; name="file"; filename="Liiii.png"" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"
    " dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"Content-Type: image/png" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"
    " dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"
    " dataUsingEncoding:NSUTF8StringEncoding]];
        /******************************************************************/
        //                      上传文件参数
        //图片数据  并且转换为Data
        UIImage *image = [UIImage imageNamed:@"Liiii"];
        NSData *imagedata = UIImagePNGRepresentation(image);
        [data appendData:imagedata];
        [data appendData:[@"
    " dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"
    " dataUsingEncoding:NSUTF8StringEncoding]];
        /******************************************************************/
        //                       非文件参数
        [data appendData:[@"------WebKitFormBoundaryUFNaH6losNxu4xDq" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"
    " dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"Content-Disposition: form-data; name="username"" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"
    " dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"
    " dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"LitterL" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"
    " dataUsingEncoding:NSUTF8StringEncoding]];
        /******************************************************************/
        //                      添加结束标记
        [data appendData:[@"------WebKitFormBoundaryUFNaH6losNxu4xDq--" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"
    " dataUsingEncoding:NSUTF8StringEncoding]];
        /******************************************************************/
    
        //请求方式
        request.HTTPMethod = @"POST";
        //请求体
        request.HTTPBody = data;
    
        //3、 创建NSURLSession
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        //创建Task
        NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:data completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
        }];
        //执行任务
        [task resume];
    }
    
    • 4、这个里面为有一点不同的就是,它的代理(NSURLSessionTaskDelegate)中能实时获取它上传 的进度,并且非常方便
    /*
     只要给服务器上传数据就会调用 (一次或多次)
        bytesSent: 当前这一次发送的数据长度
        totalBytesSent: 总共已经发送的数据长度
        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);
    }
    /*
        判断是否上传成功,如果失败error是具有值
    */
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
    {
        NSLog(@"%s, %@", __func__, error);
    }
    

    结束

                      本章到此结束
                欢迎各位码友随意转载并指正
  • 相关阅读:
    Ext.Ajax.request 传值问题
    类型反射与晚期绑定
    .net使用外部程序集拓展功能
    C#求解哈夫曼树
    几种获取操作系统语言的方法及其相似点与不同点
    C#调用非托管代码(C++方法)的2种方式
    构建可终结类型和可处置类型
    dockercompose 安装配置neo4j
    Windows 7 SDK Fails to Install with Return Code 5100 (GRMSDK_EN_DVD.iso)
    mysql密码修改方法
  • 原文地址:https://www.cnblogs.com/ljy-666/p/5151885.html
Copyright © 2011-2022 走看看