文件上传设置请求体的数据格式

2016-09-20  本文已影响0人  莫_名

/*******************************************/

/*
 使用POST请求上传文件的过程

 1.需要设置请求头
 Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryhBDKBUWBHnAgvz9c

 2.按照特定的格式拼接请求体
 ------WebKitFormBoundaryhBDKBUWBHnAgvz9c
 Content-Disposition: form-data; name="file"; filename="test.png"
 Content-Type: image/png


 ------WebKitFormBoundaryhBDKBUWBHnAgvz9c
 Content-Disposition: form-data; name="username"

 wendingding
 ------WebKitFormBoundaryhBDKBUWBHnAgvz9c--
*/

/*******************************************/

//请求体拼接格式
//分隔符:----WebKitFormBoundaryhBDKBUWBHnAgvz9c

//01.文件参数拼接格式
/*
 --分隔符
 Content-Disposition:参数
 Content-Type:参数
 空行
 文件参数
 */

//02.非文件拼接参数
/*
 --分隔符
 Content-Disposition:参数
 空行
 非文件的二进制数据
 */

//03.结尾标识
//--分隔符--

/*******************************************/

#pragma mark--使用NSURLConnection进行文件上传
#define Kboundary @"----WebKitFormBoundaryhBDKBUWBHnAgvz9c"
#define KnewLine  [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]
- (void)upload
{
    //1.确定请求路径
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];

    //2.创建一个可变的请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //3.设置请求方式为POST
    request.HTTPMethod = @"POST";

    //4.设置请求头
    NSString *filed = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary];
    [request setValue:filed forHTTPHeaderField:@"Content-Type"];

    //5.设置请求体
    NSMutableData *data = [NSMutableData data];
    //5.1 文件参数
    /*
     --分隔符
     Content-Disposition:参数
     Content-Type:参数
     空行
     文件参数
     */
    [data appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:KnewLine];
    [data appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"test.png\"" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:KnewLine];
    [data appendData:[@"Content-Type: image/png" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:KnewLine];
//    [data appendData:KnewLine];
    [data appendData:KnewLine];

    UIImage *image = [UIImage imageNamed:@"test"];
    NSData *imageData = UIImagePNGRepresentation(image);
    [data appendData:imageData];
    [data appendData:KnewLine];

    //5.2 非文件参数
    /*
     --分隔符
     Content-Disposition:参数
     空行
     非文件参数的二进制数据
     */

    [data appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];

    [data appendData:KnewLine];
    [data appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];
    [data appendData:KnewLine];
//    [data appendData:KnewLine];
    [data appendData:KnewLine];

    NSData *nameData = [@"wendingding" dataUsingEncoding:NSUTF8StringEncoding];
    [data appendData:nameData];
    [data appendData:KnewLine];

    //5.3 结尾标识
    //--分隔符--
    [data appendData:[[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
//    [data appendData:KnewLine];

    request.HTTPBody = data;

    //6.发送请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {

        //需要多做一层判断,程序容错处理
        //判断网络请求是否成功(考虑到是否有网,是否请求超时等等情况)
        if (connectionError == nil) {
            //7.解析服务器返回的数据
            NSLog(@"%@",[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
        }else
        {
            NSLog(@"网络请求失败%@",connectionError);
        }
    }];
}

上一篇 下一篇

猜你喜欢

热点阅读