美文网首页IOS特技程序员iOS 开发
iOS网络篇-NSURLSessionDownloadTask上

iOS网络篇-NSURLSessionDownloadTask上

作者: LitterL | 来源:发表于2016-01-22 17:15 被阅读303次

    简述:

    其实使用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:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"Liiii.png\"" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"Content-Type: image/png" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        /******************************************************************/
        //                      上传文件参数
        //图片数据  并且转换为Data
        UIImage *image = [UIImage imageNamed:@"Liiii"];
        NSData *imagedata = UIImagePNGRepresentation(image);
        [data appendData:imagedata];
        [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        /******************************************************************/
        //                       非文件参数
        [data appendData:[@"------WebKitFormBoundaryUFNaH6losNxu4xDq" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"LitterL" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        /******************************************************************/
        //                      添加结束标记
        [data appendData:[@"------WebKitFormBoundaryUFNaH6losNxu4xDq--" dataUsingEncoding:NSUTF8StringEncoding]];
        [data appendData:[@"\r\n" 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);
    }
    

    结束

                      本章到此结束
                欢迎各位码友随意转载并指正

    相关文章

      网友评论

        本文标题:iOS网络篇-NSURLSessionDownloadTask上

        本文链接:https://www.haomeiwen.com/subject/llqrkttx.html