年年有"余"

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 21102|回复: 26

iOS开发中post请求图片上传如何实现

[复制链接]
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

    发表于 2014-11-11 11:14:54 | 显示全部楼层 |阅读模式
    本帖最后由 Sian 于 2015-7-12 13:57 编辑

    1、网络请求中常用的有Get请求,Post请求,还有Head、Put、Delete、Options、Trace、Connect等
    GET 获取指定资源
    POST 向指定资源提交数据进行处理请求,在RESTful风格中用于新增资源
    HEAD 获取指定资源头部信息
    PUT 替换指定资源(不支持浏览器操作)
    DELETE 删除指定资源
    OPTIONS 允许客户端查看服务器的性能
    TRACE 回显服务器收到的请求,主要用于测试或诊断
    CONNECT 预留给能够将连接改为管道方式的代理服务器(HTTP代理使用)

    2、上传图片在网页中最常用的就是POST请求了,将图片编码到POST请求体(body)中,通过请求数据一起发送到服务器上;

    3、在iOS开发中,图片上传的请求体非常难写,格式要求非常严格,出一点错误都会造成上传失败,或请求数据失败,先看格式:
    --Boundary+72D4CD655314C423
    Content-Disposition: form-data; name="uploadFile"; filename="001.png"
    Content-Type:image/png
    Content-Transfer-Encoding: binary

    ... contents of boris.png ...
    --Boundary+72D4CD655314C423--
    这是一个不带其他任务参数,body中只有一张图就要写成这样
    分别说明一下:
    --Boundary+72D4CD655314C423   // 分割符,以“--”开头,后面的字随便写,只要不写中文即可
    Content-Disposition: form-data; name="uploadFile"; filename="001.png"  // 这里注明服务器接收图片的参数(类似于接收用户名的userName)及服务器上保存图片的文件名
    Content-Type:image/png  // 图片类型为png
    Content-Transfer-Encoding: binary  // 编码方式
      // 这里是空一行,必不可少!!
    ... contents of boris.png ...  // 图片数据部分
    --Boundary+72D4CD655314C423--  // 分隔符后面以"--"结尾,表明结束

    3、如果有其他表单数据,如传用户ID等参数,也要写成以上格式:
    --Boundary+72D4CD655314C423
    Content-Disposition: form-data; name="userId"
         
    254
    --Boundary+72D4CD655314C423
    Content-Disposition: form-data; name="shopId"
         
    18718
    具体参数含义与图片一致,一般这段会在图片上面,因此没有结尾符,如果没有其他数据了,那要加上结尾符。

    4、代码示例:

    [Objective-C] 纯文本查看 复制代码
    - (void)upload
    {
        NSString *urlStr = @"http://localhost/upload.php";
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStr] cachePolicy:0 timeoutInterval:5.0f];
        
        [self setRequest:request];
        
        NSLog(@"开始上传...");
        [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            
            NSLog(@"Result--%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
            
        }];
    }
    
    - (void)setRequest:(NSMutableURLRequest *)request
    {
        NSString *boundary = [NSString stringWithFormat:@"Boundary+%08X%08X", arc4random(), arc4random()];
        NSMutableData *body = [NSMutableData data];
        
        // 表单数据
        NSMutableDictionary *param = [[NSMutableDictionary alloc] init];
        [param setValue:@"254" forKey:@"empId"];
        [param setValue:@"18718" forKey:@"shopId"];
        
        /** 遍历字典将字典中的键值对转换成请求格式:
         --Boundary+72D4CD655314C423
         Content-Disposition: form-data; name="empId"
         
         254
         --Boundary+72D4CD655314C423
         Content-Disposition: form-data; name="shopId"
         
         18718
         */
        [param enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
            NSMutableString *fieldStr = [NSMutableString string];
            [fieldStr appendString:[NSString stringWithFormat:@"--%@\r\n", boundary]];
            [fieldStr appendString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key]];
            [fieldStr appendString:[NSString stringWithFormat:@"%@", obj]];
            [body appendData:[fieldStr dataUsingEncoding:NSUTF8StringEncoding]];
            [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        }];
        
        
        /// 图片数据部分
        NSMutableString *topStr = [NSMutableString string];
        NSString *path = [[NSBundle mainBundle] pathForResource:@"001.jpg" ofType:nil];
        NSData *data = [NSData dataWithContentsOfFile:path];
        
        /**拼装成格式:
         --Boundary+72D4CD655314C423
         Content-Disposition: form-data; name="uploadFile"; filename="001.png"
         Content-Type:image/png
         Content-Transfer-Encoding: binary
         
         ... contents of boris.png ...
         */
        [topStr appendString:[NSString stringWithFormat:@"--%@\r\n", boundary]];
        [topStr appendString:@"Content-Disposition: form-data; name=\"uploadFile\"; filename=\"001.png\"\r\n"];
        [topStr appendString:@"Content-Type:image/png\r\n"];
        [topStr appendString:@"Content-Transfer-Encoding: binary\r\n\r\n"];
        [body appendData:[topStr dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:data];
        [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        
        // 结束部分
        NSString *bottomStr = [NSString stringWithFormat:@"--%@--", boundary];
        /**拼装成格式:
         --Boundary+72D4CD655314C423--
         */
        [body appendData:[bottomStr dataUsingEncoding:NSUTF8StringEncoding]];
        
        // 设置请求类型为post请求
        request.HTTPMethod = @"post";
        // 设置request的请求体
        request.HTTPBody = body;
        // 设置头部数据,标明上传数据总大小,用于服务器接收校验
        [request setValue:[NSString stringWithFormat:@"%d", body.length] forHTTPHeaderField:@"Content-Length"];
        // 设置头部数据,指定了http post请求的编码方式为multipart/form-data(上传文件必须用这个)。
        [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField:@"Content-Type"];
    }
    5、提供一个可接收Post上传数据的php文件,放到支持php的服务器上进行测试:
    游客,如果您要查看本帖隐藏内容请回复
  • TA的每日心情
    奋斗
    2022-12-13 21:26
  • 签到天数: 371 天

    [LV.9]以坛为家II

     楼主| 发表于 2014-11-11 11:16:48 | 显示全部楼层
    post请求基础内容参考:http://www.yusian.com/bbs/thread-8014-1-1.html

    该用户从未签到

    发表于 2015-3-18 09:21:25 | 显示全部楼层
    看一下看一下看一下看一下
  • TA的每日心情
    犯困
    2015-1-11 14:36
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2015-4-3 16:16:18 | 显示全部楼层
    我要看一下这个代码啊

    该用户从未签到

    发表于 2015-4-9 16:28:59 | 显示全部楼层
    mark,一定得看看!
  • TA的每日心情
    开心
    2015-4-8 13:41
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-7-3 13:41:34 | 显示全部楼层
    xiefeixjfs;fadfjkdlas
  • TA的每日心情
    害羞
    2015-7-29 22:02
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-7-30 00:22:20 | 显示全部楼层
    感谢分享。正在搞这个。看看先

    该用户从未签到

    发表于 2015-8-4 07:51:44 | 显示全部楼层
    很不错啊,希望能够完美解决图片上传问题

    该用户从未签到

    发表于 2015-8-6 17:38:23 | 显示全部楼层
    下来试试下来试试下来试试下来试试下来试试

    该用户从未签到

    发表于 2015-10-20 12:10:17 | 显示全部楼层
    干货先收了再说
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|Archiver|iOS开发笔记 ( 湘ICP备14010846号 )

    GMT+8, 2024-3-29 07:59 , Processed in 0.055087 second(s), 26 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表