需求:上传一张照片和内容,内容包括:用户编辑的内容、经纬度、地点等等,就是类似发一个说说。这就是一个很平常的功能,实现的方式想必各位能想到很多。

接下来我想用系统的NSURLConnection来实现这个功能:

首先我们要定义一个全局变量:

/**
* 请求返回数据
*/
@property (nonatomic, strong) NSMutableData *mResponseData;

实现代码:

//字典里面装的是你要上传的内容
NSDictionary *parameters = @{@"content": @"这是刚刚在线的官方网站www.superqq.com"}; //上传的接口
NSString* urlstring = @"http://superqq.com/";
//分界线的标识符
NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";
//根据url初始化request
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlstring]
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:10];
//分界线 --AaB03x
NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];
//结束符 AaB03x--
NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];
// //要上传的图片
// UIImage *image=[params objectForKey:@"pic"];
//得到图片的data
NSData *data = UIImagePNGRepresentation(self.image);
//http body的字符串
NSMutableString *body=[[NSMutableString alloc]init];
//参数的集合的所有key的集合
NSArray *keys= [parameters allKeys]; //遍历keys
for(int i=0;i<[keys count];i++)
{
//得到当前key
NSString *key=[keys objectAtIndex:i];
//如果key不是pic,说明value是字符类型,比如name:Boris
if(![key isEqualToString:@"pic"])
{
//添加分界线,换行
[body appendFormat:@"%@\r\n",MPboundary];
//添加字段名称,换2行
[body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
//添加字段的值
[body appendFormat:@"%@\r\n",[parameters objectForKey:key]];
}
} ////添加分界线,换行
[body appendFormat:@"%@\r\n",MPboundary];
//声明pic字段,文件名为boris.png
[body appendFormat:@"Content-Disposition: form-data; name=\"pic\"; filename=\"boris.png\"\r\n"];
//声明上传文件的格式
[body appendFormat:@"Content-Type: image/png\r\n\r\n"]; //声明结束符:--AaB03x--
NSString *end=[[NSString alloc]initWithFormat:@"\r\n%@",endMPboundary];
//声明myRequestData,用来放入http body
NSMutableData *myRequestData=[NSMutableData data];
//将body字符串转化为UTF8格式的二进制
[myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
//将image的data加入
[myRequestData appendData:data];
//加入结束符--AaB03x--
[myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]]; //设置HTTPHeader中Content-Type的值
NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];
//设置HTTPHeader
[request setValue:content forHTTPHeaderField:@"Content-Type"];
//设置Content-Length
[request setValue:[NSString stringWithFormat:@"%d", (int)[myRequestData length]] forHTTPHeaderField:@"Content-Length"];
//设置http body
[request setHTTPBody:myRequestData];
//http method
[request setHTTPMethod:@"POST"]; //建立连接,设置代理
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; //设置接受response的data
if (conn) {
_mResponseData = [[NSMutableData alloc] init];
}

NSURLConnectionDelegate的代理方法:

#pragma mark - NSURLConnectionDelegate

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[_mResponseData setLength:0];
} - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[_mResponseData appendData:data];
} - (void)connectionDidFinishLoading:(NSURLConnection *)connection
{ NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:_mResponseData options:kNilOptions error:nil];
NSLog(@"%@", dic); } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"Error: %@", error);
}

在不同的系统中,\t\n ,\t,\n这三个有不同的含义,在这里,\t\n相当于用键盘的回车键进行换行

Posted by 李刚 Dec 11th, 2014 10:00 am  ios开发

来源:刚刚在线(微信:iOSDevTip),欢迎分享本文,转载请保留出处! 
原文链接:http://www.superqq.com/blog/2014/12/11/nsmutableurlrequesthe-nsurlconnectionyong-postfang-shi-shang-chuan-zhao-pian/

 

NSMutableURLRequest和NSURLConnection用Post方式上传照的更多相关文章

  1. Ajax方式上传文件

    用到两个对象 第一个对象:FormData 第二个对象:XMLHttpRequest 目前新版的Firefox 与 Chrome 等支持HTML5的浏览器完美的支持这两个对象,但IE9尚未支持 For ...

  2. 通过Ajax方式上传文件,使用FormData进行Ajax请求

    通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...

  3. &lt;源代码&gt;FTPclient追加方式上传自己定义信息

    实现功能:向FTPserver以追加方式上传自己定义信息(例程中为:2014-10-08 13:47:15 test.) 源代码下载(免积分):http://download.csdn.net/det ...

  4. Android必知必会-使用okhttp的PUT方式上传文件

    注:如果移动端排版有问题,请看 简书版 (<-点击左边),希望CSDN能更好的支持移动端. 背景 公司的文件上传接口使用PUT协议,之前一直用的都是老项目中的上传类,现在项目中使用了okhttp ...

  5. koa2:通过Ajax方式上传文件,使用FormData进行Ajax请求

    koa2通过表单上传的网上很多,但通过Ajax方式上传文件,使用FormData进行Ajax请求,不好找. 参考了这个用base64上传图片的例子.https://github.com/Yuki-Mi ...

  6. 前端 - jquery方式 / iframe +form 方式 上传文件

    环境与上一章一样 jquery 方式上传文件: HTML代码 {#html代码开始#} <input type="file" id="img" > ...

  7. [转] 通过Ajax方式上传文件,使用FormData进行Ajax请求

    通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...

  8. IOUtils方式上传下载文件

    package com.css.hdfs04; import java.io.File; import java.io.FileInputStream; import java.io.FileOutp ...

  9. 在Eclipse上使用egit插件通过ssh协议方式上传项目代码的具体步骤

    在Eclipse上使用egit插件通过ssh协议方式上传项目代码 前戏: 使用ssh方式可以不通过https协议,避免直接提供账号密码的方式上传项目到git在线服务器,如Bitbucket.GitHu ...

随机推荐

  1. Docker Network containers

    Network containers Estimated reading time: 5 minutes If you are working your way through the user gu ...

  2. java中有类似C#里ref或out的功能吗?

    JAVA中都是值传递.JAVA中的“引用”和C++中的引用有本质的区别,倒是和C++中的指针非常类似.可以将JAVA的引用理解为“不支持指针运算的指针”.所以可以说JAVA中其实并不存在真正的引用,所 ...

  3. Jenkins学习二:Jenkins安装与配置

    安装前关注: Q:应该选择哪个版本的Jenkins? A:如果你是公司正式使用推荐长期支持版(LTS),原因:稳定.如果你是学习,随便哪个版本都可以. Q:JDK应该安装哪个版本的? A:推荐安装JD ...

  4. 如何为logo配色

    原网链接:http://design.jobbole.com/125287/ 色彩是带有情绪的.我们能感知到的色彩能带来各种各样的情绪,也能传达一种思想或一种文化. 企业logo的色彩就是利用上面的原 ...

  5. c++ 基于wincrypt的DES CBC模式加解密

    des.h #pragma once #include <windows.h> #include <atlstr.h> #include <wincrypt.h> ...

  6. Java8简单的本地缓存实现

    原文出处:lukaseder         Java8简单的本地缓存实现 这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存.因为Map有一个新的方法,在 ...

  7. 自定义JS常用方法

    1,获取表格中的元素,支持IE,chrome,firefox //获取表单元素的某一个值 function getTableColumnValue(tableId, rowNumber, column ...

  8. jQuery offset,position,offsetParent,scrollLeft,scrollTop html控件定位 css position

    定位应用:点击一个按钮,然后在按钮的右边弹出一个提示框 1,提示框相对于屏幕进行定位,那么使用offset来取得当前按钮相对于body的top和left,然后通过$('body').prepend(t ...

  9. 将packages/apps/下的app导入eclipse

    当刚接触android自带的一个模块时,如何去熟悉它?相信不少人第一步都会尝试着去了解其内容的调用流程,而此时若能够单步调试则显得非常重要了,于是有了文章标题所说的尝试. 作者这里要导入的是Setti ...

  10. oracle:如何用sql生成日历

    BI分析中,经常需要将事实表与时间维度表关联起来,按年/月/日来逐层展示,常用的做法是创建一张日历表,结构类似如下: create table T_BAS_CALENDAR ( d_year ) no ...