網絡篇-NSURLSessionDownloadTask上傳

簡述:服務器

其實使用NSURLSessionDownloadTask上傳和NSURLConnection原生上傳差很少都是須要拼接,而且也很是麻煩,好了廢話很少說,,直接幹完這篇就去吃晚飯去了。session

代碼:app

  • 一、這裏的話直接肯定了一個大綱,只差拼接了,由於無論怎樣首先都是先有URL而後再有請求對象最後在發送請求。
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    //由於文件比較大  咱們這裏就使用POST了
    //一、肯定URL
    NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/upload"];
    //二、肯定請求   由於用POST請求,因此這裏使用NSMutableURLRequest
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    //2.一、 設置請求方式 post
    request.HTTPMethod = @"POST";

    //2.二、請求體個人拼一個會兒........
    //request.HTTPBody = ?;



    //三、 建立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了

    //一、肯定URL
    NSURL *url = [NSURL URLWithString:@"http://192.168.1.0:8080/upload"];

    //二、肯定請求
    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;

    //三、 建立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];
}
  • 四、這個裏面爲有一點不一樣的就是,它的代理(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);
}

結束代理

本章到此結束
            歡迎各位碼友隨意轉載並指正
相關文章
相關標籤/搜索