文件上传

直接上代码 
// 1. 文件上传傻瓜版 
- (void)upload {
    
    // 1.上传给服务器的路径
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"请求路径"]];
    
    // 2. 创建一个POST请求
    request.HTTPMethod = @"POST";
    
    // 如果请求体不一样了(JSON或者文件等),得通过请求头告诉服务器 ,内容的类型  MIMEType 比如 txt  png  等等
    // 设置请求头 告诉服务器这次传给你的是 什么类型
    
    //    ------------------149394928198239
    //    content-disposition:form-data;name=@"参数名";filename=@"文件名";
    //    content—type:文件类型(MIMEType)
    //
    //    文件具体数据
    
    // ----开始拼接
    
    // 3.设置请求体
    NSMutableData *body = [NSMutableData data];
    // 3.1 文件参数
    // boundary
    [body appendData:Encode(@"--")];
    [body appendData:Encode(FileBoundary)]; // 拼接分隔符
    [body appendData:Encode(NewLine)];      // 换行,严格来说是 \r\n
    
    // \ 转义   disposition
    [body appendData:Encode(@"Content-Disposition: form-data; name=@\"参数名\"; filename=@\"文件名\"")];
    [body appendData:Encode(NewLine)];
    
    [body appendData:Encode(@"Content—Type: image/png")];
    [body appendData:Encode(NewLine)];
    
    // 这是要上传的数据
    [body appendData:Encode(NewLine)];
    UIImage *image = [UIImage imageNamed:@"图片名字"];
    // UIImage - > NSData 
    NSData *imageData = UIImagePNGRepresentation(image);
    [body appendData:imageData];
    [body appendData:Encode(NewLine)];
    
    //    ------------------charles
    //    content-disposition:form-data;name=@"参数名"
    //
    //    参数值
    
    // 3.2 非文件参数
    [body appendData:Encode(@"--")];
    [body appendData:Encode(FileBoundary)];
    [body appendData:Encode(NewLine)];
    
    // \ 转义
    [body appendData:Encode(@"Content-Disposition: form-data; name=@\"参数名\"")];
    [body appendData:Encode(NewLine)];
    
    // 这是要上传的数据
    [body appendData:Encode(NewLine)];
    [body appendData:Encode(@"张三")];
    [body appendData:Encode(NewLine)];
    
    // 3.3
    [body appendData:Encode(@"--")];
    [body appendData:Encode(FileBoundary)];
    [body appendData:Encode(@"--")];
    [body appendData:Encode(NewLine)];
    
    request.HTTPBody = body;
    
    // 4. 设置请求头
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@\r\n",FileBoundary];
    // 设置请求头类型和长度
    [request setValue:contentType forKey:@"Content-Type"];
    NSString *value = [NSString stringWithFormat:@"%lu",body.length];
    [request setValue:value forKey:@"Content-Length"];
    
    // 5. 发送异步请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
        if (data == nil || connectionError) {
            
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
            NSLog(@"%@",dict);
        } else { // 文件上传成功
            
            NSLog(@"%@",connectionError);
        }
    }];
    
}

// 2. 文件上传加强版,(封装版) 
- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    // 情况 1个文件 多个非文件参数
    NSDictionary *params = @{
                             @"username" : @"李四",
                             @"password" : @"123"
                             };
    // 文件开始上传
    
    // 文件名字随便起 只是告诉服务器它需要生成什么名字
    UIImage *image = [UIImage imageNamed:@"图片名字"];
    [self upload:@"文件名字" mimeType:@"image/png" fileData:UIImagePNGRepresentation(image) params:params];
    
}
// 上传给我文件名和参数等。。

// 文件数据: fileName 和 mimeType   其他数据 字典
// 给我文件名 文件类型 文件数据 我给你上传~~~~

- (void)upload:(NSString *)fileName
      mimeType:(NSString *)mimeType
      fileData:(NSData *)fileData
        params:(NSDictionary *)params {
    
    
    
    // 1.上传给服务器的路径
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"请求路径"]];
    
    // 2. 创建一个POST请求
    request.HTTPMethod = @"POST";
    
    // 如果请求体不一样了,得通过请求头告诉服务 ,内容的类型
    // 设置请求头 告诉服务器这次传给你的是神马类型~~
    // 这次是一个文件数据~~~
    //    ------------------149394928198239
    //    content-disposition:form-data;name=@"参数名";filename=@"文件名";
    //    content—type:文件类型(MIMEType)
    //
    //    文件具体数据
    
    // ----开始拼接
    
    // 3.设置请求体
    NSMutableData *body = [NSMutableData data];
    // 3.1 文件参数
    // boundary
    [body appendData:Encode(@"--")];
    [body appendData:Encode(FileBoundary)];
    [body appendData:Encode(NewLine)];
    
    // \ 转义
    NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=@\"参数名\"; filename=@\"%@\"",fileName];
    [body appendData:Encode(disposition)];
    [body appendData:Encode(NewLine)];
    
    
    NSString *type = [NSString stringWithFormat:@"Content—Type: %@",mimeType];
    [body appendData:Encode(type)];
    [body appendData:Encode(NewLine)];
    [body appendData:Encode(NewLine)];
    
    [body appendData:fileData];
    [body appendData:Encode(NewLine)];
    
    //    ------------------charles
    //    content-disposition:form-data;name=@"参数名"
    //
    //    参数值
    
    // 3.2 非文件参数
    // 遍历 字典中的参数   追加到请求体中
    [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        
        [body appendData:Encode(@"--")]; // 比ContentType多@"--"
        [body appendData:Encode(FileBoundary)];
        [body appendData:Encode(NewLine)];
        
        // \ 转义
        NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=@\"%@\"",key];
        [body appendData:Encode(disposition)];
        [body appendData:Encode(NewLine)];
        [body appendData:Encode(NewLine)];
        
        // id -> NSString 转化为字符串description
        [body appendData:Encode([obj description])];
        [body appendData:Encode(NewLine)];
    }];
    
    // 3.3 结束标记
    [body appendData:Encode(@"--")];
    [body appendData:Encode(FileBoundary)];
    [body appendData:Encode(@"--")];
    [body appendData:Encode(NewLine)];
    request.HTTPBody = body;
    
    // 4. 设置请求头
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@\r\n",FileBoundary];
    // 类型和长度
    [request setValue:contentType forKey:@"Content-Type"];
    NSString *value = [NSString stringWithFormat:@"%lu",body.length];
    [request setValue:value forKey:@"Content-Length"];
    
    // 5. 发送请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
        NSLog(@"%@",dict);
    }];
    
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值