美文网首页
iOS HTTP Multipart Forms POST(头像

iOS HTTP Multipart Forms POST(头像

作者: 行业碧油鸡 | 来源:发表于2018-04-13 15:45 被阅读107次

    +++
    Categories = ["iOS",]
    Tags = ["iOS","http",]
    date = "2014-09-13T12:49:42+08:00"
    title = "iOS HTTP Multipart Forms POST(头像图片上传)"

    +++

    由于iOS无法通过html表单来上传图片,因此想要上传图片,必须实现http请求,而不能像其他语言那样通过html表单的post就能上传。

    上传图片的http post请求的格式是这样的:

    Content-type: multipart/form-data, boundary=---------------------------14737809831466499882746641449
    
    ---------------------------14737809831466499882746641449
    Content-Disposition: form-data; name="pic"; filename="boo.jpg"
    Content-Type: image/jpeg
    
    ... contents of boo,jpg ...
    ---------------------------14737809831466499882746641449
    Content-Disposition: form-data; name="info"
    
    Hello Boris!
    ---------------------------14737809831466499882746641449
    

    第一行是指定了http post请求的编码方式为multipart/form-data(上传文件必须用这个)。
    boundary= xxx 说明了xxx为分界线。比如 ---------------------------14737809831466499882746641449 就是一个分界线的意思

    Content-Disposition: form-data; name="info"
    
    Hello Boris!
    

    这句话声明了请求中的一个字段的名称,如info 以及字段的值,如Hello Boris!
    这里类似form表单中的<input name="info" type="text" value="Hello Boris!"/>
    中间的空行是必须的。

    不同的字段之间用分界线分开,分界线需要单独一行,如 ---------------------------14737809831466499882746641449

    分界线的下一行,是下一个字段

    content-disposition: form-data; name="pic"; filename="boo.png"
    Content-Type: image/png
    
    ... contents of boo.png ...
    

    这里声明了变量pic,也就是我们要传的文件,上传文件的时候需要在后边指定file name:filename="boo.png"
    并且需要在下一行指定文件的格式:Content-Type: image/png

    ... contents of boo.png ... 这里是boo.png的二进制内容,如

    <89504e47 0d0a1a0a 0000000d 49484452 000000b4 000000b4 08020000 00b2af91 65000020 00494441 5478012c dd79b724 6b7616f6 8c888c88 8c9c8733 55ddb1d5 6a0db486 06218401 ......

    在http post请求的结尾,需要有一个分界线,但是是前后都有--的:

    ---------------------------14737809831466499882746641449

    以上的这些格式,是http的规范,每个空行,空格都是必须的。

    下边是iOS的实现代码:

    // 建立请求对象
    NSMutableURLRequest * request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:kRequestBaseApi]];
    
    // 请求方式
    [request setHTTPMethod:@"POST"];
    [request setTimeoutInterval:kCLTimeoutInterval];
    
    // 接口参数
    NSString *string = [NSString stringWithFormat:@"{\"action\":\"saveHeadImg\",\"uid\":\"%@\"}", [ClientState shareInstance].currentUID];
    
    // 头标签,分隔线
    NSString *boundary = @"---------------------------14737809831466499882746641449";
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
    
    NSMutableData *body = [NSMutableData data];
    
    // 添加接口参数
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Disposition: form-data; name=\"req\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"%@\r\n",string] dataUsingEncoding:NSUTF8StringEncoding]];
    
    // 添加图片data
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"files\"; filename=\"%@\"\r\n", fileName]
                      dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: image/pjpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:imageData]];
    
    // 添加尾部分隔线
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [request setHTTPBody:body];
    

    相关文章

      网友评论

          本文标题:iOS HTTP Multipart Forms POST(头像

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