Sian 发表于 2014-11-11 11:14:54

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

本帖最后由 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+72D4CD655314C423Content-Disposition: form-data; name="uploadFile"; filename="001.png"Content-Type:image/pngContent-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// 图片类型为pngContent-Transfer-Encoding: binary// 编码方式// 这里是空一行,必不可少!!... contents of boris.png ...// 图片数据部分--Boundary+72D4CD655314C423--// 分隔符后面以"--"结尾,表明结束
3、如果有其他表单数据,如传用户ID等参数,也要写成以上格式:--Boundary+72D4CD655314C423Content-Disposition: form-data; name="userId"   254--Boundary+72D4CD655314C423Content-Disposition: form-data; name="shopId"   18718具体参数含义与图片一致,一般这段会在图片上面,因此没有结尾符,如果没有其他数据了,那要加上结尾符。
4、代码示例:
- (void)upload
{
    NSString *urlStr = @"http://localhost/upload.php";
    NSMutableURLRequest *request = cachePolicy:0 timeoutInterval:5.0f];
   
    ;
   
    NSLog(@"开始上传...");
    init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
      
      NSLog(@"Result--%@", [ initWithData:data encoding:NSUTF8StringEncoding]);
      
    }];
}

- (void)setRequest:(NSMutableURLRequest *)request
{
    NSString *boundary = ;
    NSMutableData *body = ;
   
    // 表单数据
    NSMutableDictionary *param = [ init];
    ;
    ;
   
    /** 遍历字典将字典中的键值对转换成请求格式:
   --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 *topStr = ;
    NSString *path = [ pathForResource:@"001.jpg" ofType:nil];
    NSData *data = ;
   
    /**拼装成格式:
   --Boundary+72D4CD655314C423
   Content-Disposition: form-data; name="uploadFile"; filename="001.png"
   Content-Type:image/png
   Content-Transfer-Encoding: binary
   
   ... contents of boris.png ...
   */
    ];
    ;
    ;
    ;
    ];
    ;
    ];
   
    // 结束部分
    NSString *bottomStr = ;
    /**拼装成格式:
   --Boundary+72D4CD655314C423--
   */
    ];
   
    // 设置请求类型为post请求
    request.HTTPMethod = @"post";
    // 设置request的请求体
    request.HTTPBody = body;
    // 设置头部数据,标明上传数据总大小,用于服务器接收校验
    forHTTPHeaderField:@"Content-Length"];
    // 设置头部数据,指定了http post请求的编码方式为multipart/form-data(上传文件必须用这个)。
    forHTTPHeaderField:@"Content-Type"];
}5、提供一个可接收Post上传数据的php文件,放到支持php的服务器上进行测试:**** Hidden Message *****

Sian 发表于 2014-11-11 11:16:48

post请求基础内容参考:http://www.yusian.com/bbs/thread-8014-1-1.html

darkfire 发表于 2015-3-18 09:21:25

看一下看一下看一下看一下

活在梦里丶 发表于 2015-4-3 16:16:18

我要看一下这个代码啊

asd82224f 发表于 2015-4-9 16:28:59

mark,一定得看看!

xiaoyuzaizoulu 发表于 2015-7-3 13:41:34

xiefeixjfs;fadfjkdlas

骑士王 发表于 2015-7-30 00:22:20

感谢分享。正在搞这个。看看先

lcvv 发表于 2015-8-4 07:51:44

很不错啊,希望能够完美解决图片上传问题

zhuzhi520 发表于 2015-8-6 17:38:23

下来试试下来试试下来试试下来试试下来试试

haixingaa 发表于 2015-10-20 12:10:17

干货先收了再说
页: [1] 2 3
查看完整版本: iOS开发中post请求图片上传如何实现