美文网首页iOS、swift技术交流!
利用原生态NSURLConnection上传用户头像

利用原生态NSURLConnection上传用户头像

作者: 光明程辉 | 来源:发表于2016-01-27 19:58 被阅读142次

    第一方登录.png

    看一下界面:

    登录界面.png
    • 服务器默认是的头像:


      服务器默认头像.png

    1、首先:我们利用导入 #import "AFNetworking.h"

    • 设置登录方法:
      利用:AFHTTPRequestOperationManager

       // ----- 登录方法
        AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
      
        // 参数 ---- 字典
        NSDictionary *param = @{@"username":_userTextField.text,@"password":_pwdTextField.text};
      
    • 发送一个GET 请求
      [manager GET:kLoginURL parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {

       NSLog(@"%@",responseObject);// 打印输出结果(利用结果,才能写下面的key 的值!!!)
      
               NSString *code = responseObject[@"code"];// 这个看接口设计人员设计了。这里设计是code 
               NSString *message = responseObject[@"message"];
           [self showMessage:message];#pragma mark --- 如果登录成功
       if ([code isEqualToString:@"login_success"]) {// 根据son值判断是否登录成功
      
           // 跳到下一个界面
           AlbumViewController *albumVC = [[AlbumViewController alloc] init];
           UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:albumVC];
           // 好友相册 的返回按钮是 “注销”,不是返回。所以,要用 presentViewController
           [self presentViewController:nav animated:YES completion:^{
               _longBtn.enabled = YES;
           }];
           _longBtn.enabled = YES;
           
          }else {
           _longBtn.enabled = YES;
       }
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      
         NSLog(@"%@",error);
      
         [self showMessage:@"网络连接发生错误!!"]; 
         _longBtn.enabled = YES;
        }];
      
    • 打印结果是一个JSON:

    打印结果.png
    • 说明登录成功了!

    上传头像

    • 先看一下手机页面:
    上传头像.png
    • 利用原生态 NSURLConnection(后继会利用框架,更简单!!!)留意我封装的这个setHTTPBodyWithImage:boundary:方法。

        // 1.生成NSURL
        NSURL *url = [NSURL URLWithString:kUploadURL];
      
        // 2.生成可变的NSURLMutableRequest
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
      
        // 3.修改请求方式
        request.HTTPMethod = @"POST";
      
        // 4。设置请求头
        /**
             boundary: 是分隔符号,告诉服务器,我的请求体里用的就是就是这个分隔符,而且,拼接请求体也用到这个分隔符
         */
        //    [request setValue:@"multipart/form-data; boundary=Adifadlfzxfoiasdfqwer" forHTTPHeaderField:@"Content-Type"];
        NSString *boundary = @"Adifadlfzxfoiasdfqwer";// 这里是可以值是可以随便修改的
        [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField:@"Content-Type"];// 这些值是官方的不能乱修改
      
        // 5. 设置要上传的数据 拼接请求体
        request.HTTPBody = [self setHTTPBodyWithImage:_myImageView.image boundary:boundary];
      NSString *boundary = @"Adifadlfzxfoiasdfqwer";// 这里是可以值是可以随便修改的
        [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField:@"Content-Type"];// 那些值是官方的不能乱修改的
      
      
        // 6.�利用NSURLConnection连接网络,上传头像
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
        if (connectionError) {
            NSLog(@"connectionError:%@",connectionError);
        }else {
        
            // 先调试一下结果:看服务器返回的结果,然后,在解析!
            NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
            
            // 解析
            NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
            NSString *code = jsonData[@"code"];
            NSString *message = jsonData[@"message"];
            
            [self showMessage:message];
            _uploadBtn.selected = YES;
            
            if ([code isEqualToString:@"upload_file_ok"]) {
                // 头像上传成功
                NSLog(@"t头像上传成功");
            }else
            {
                // 头像上传失败
                NSLog(@"t头像上传失败!");
            }
            
        }
      }];
      

    到这里可以打印结果调试了:

    服务器返回成功.png
    上传到服务器失败.png
    • // 封装 图片类型,供上面的方法使用:

    • 返回 是 NSData 类型

        - (NSData *)setHTTPBodyWithImage:(UIImage *)image boundary:(NSString *)boundary
      {
      
          /**
         Body格式,每行的结尾都需要\r\n换行
         --Adifadlfzxfoiasdfqwer
         Content-Disposition: form-data; name=headimage; filename=headimage.png
         Content-Type: image/png
         空行
         文件(如图片)
         --Adifadlfzxfoiasdfqwer--
         */
      
        // 创建第一行 \r\n
        NSString *line = [NSString stringWithFormat:@"--%@\r\n",boundary];
      
        // 追加第2行
        line = [line stringByAppendingFormat:@"Content-Disposition: form-data; name=headimage; filename=headimage.png\r\n"];
      
        // 追加第3行
        line = [line stringByAppendingFormat:@"Content-Type: image/png\r\n"];
      
        // 追加第4行
        line = [line stringByAppendingFormat:@"\r\n"];
      
        // 把以上内容转化为可变的NSMutaleData
        // 生成一个不可变的 NSData
        NSData *data = [line dataUsingEncoding:NSUTF8StringEncoding];
      
        NSMutableData *bufData = [[NSMutableData alloc] initWithData:data];
      
        // 把图片变成 NSData
      NSData *imgData = UIImagePNGRepresentation(image);
      
      // 追加第5行
      [bufData appendData:imgData];
      
      // 追加换行符 \r\n
      [bufData appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
      
      // 追加第6行
      //    [NSString stringWithFormat:@"--%@--",boundary]
      [bufData appendData:[[NSString stringWithFormat:@"--%@--",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
      
        return bufData;
      } 
      

    最后,点击上传:

    上传成功.png
    • 我们去看一下服务器:成功上传头像!!!
    上传到服务器成功.png

    相关文章

      网友评论

      • 光明程辉:可以到时我放到github ,周6晚上,记得提醒我,谢谢!
      • 2b1ed5b649ed:能分享一下源码吗?谢谢! :relaxed:

      本文标题:利用原生态NSURLConnection上传用户头像

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