iOS实现文件上传功能,首先要知道的是,上传到服务器的数据格式,一般采用HTTP文件上传协议。如下图

如图所示,只要设置好了HTTP的协议格式,就可以实现文件上传功能。

代码如下:

//图片上传模块 contentData代表上传文件的数据内容
- (void)uploadFileData:(NSData *)contentData{
//获取全局的NSURLSession对象(无法设置代理)
//NSURLSession *session = [NSURLSession sharedSession];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
//http://192.168.199.237/file.php http://192.168.1.101/service?wdService=UpLoad
//服务器地址
NSURL *url = [NSURL URLWithString:@"http://192.168.1.101/service?wdService=UpLoad"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 设置请求头数据。boundary:边界(分隔符:让服务器能够识别数据!!!!!!!不要忘记这里,重要的事说三遍,不要忘记这里,不要忘记这里)
[request setValue:@"multipart/form-data; boundary=WebKitFormWYZJ2015" forHTTPHeaderField:@"Content-Type"]; // 给请求头加入固定格式数据
NSMutableData *data = [NSMutableData data];
/****************文件参数相关设置*********************/ // 设置边界 注:必须和请求头数据设置的边界一样, 前面多两个“-”;(字符串 转 data 数据),代表协议开始
[data appendData:[@"--WebKitFormWYZJ2015" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // 设置传入数据的基本属性, 包括有 传入方式 data ,传入的类型(名称)服务器接收字段 ,传入的文件名, 。
[data appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"filename.jpg\"" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // 设置内容的类型 “文件类型/扩展名” MIME中的application/octet-stream
[data appendData:[@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; //设置编码方式
[data appendData:[@"Content-Transfer-Encoding: binary" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];// 加入数据内容
[data appendData:contentData];
[data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // // 设置边界
// [data appendData:[@"--WebKitFormWYZJ2015" dataUsingEncoding:NSUTF8StringEncoding]];
// [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; /******************非文件参数相关设置**********************/
  
// // 设置传入的类型(名称),服务器解析字段username,获得用户名
// [data appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];
// [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
// [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
//
// // 传入的名称username = zhangsan
// [data appendData:[@"zhangsan" dataUsingEncoding:NSUTF8StringEncoding]];
// [data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; // 退出边界,在分隔符的后面需要加上两个"--",代表协议结束
[data appendData:[@"--WebKitFormWYZJ2015--" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; //设置HTTP主体
request.HTTPBody = data;
//设置上传文件方法,一般为POST
request.HTTPMethod = @"POST";
NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:data completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
//服务器返回数据
NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);

//服务器返回的状态码
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSUInteger httpStateCode = [httpResponse statusCode];
NSDictionary *dic = @{@"info":@(httpStateCode)};
//使用通知来传值
NSNotification *notification = [NSNotification notificationWithName:@"HttpStateCode" object:nil userInfo:dic];
[[NSNotificationCenter defaultCenter] postNotification:notification]; }];
//启动任务
[task resume];
}

在代码中,使用了NSURLSession来作为请求网络数据的对象,苹果公司在iOS9中已经不推荐使用NSURLConnection来请求网络数据了。

设置NSURLSession的代理后,可以监听文件上传的进度和文件上传情况。

iOS实现文件上传功能模块的更多相关文章

  1. iOS 的 Safari 文件上传功能详解

    iOS 6 给 Safari 浏览器带来的另外一个功能是文件上传,终于 Safari 终于支持 input 输入框的文件类型了,并且还支持 HTML媒体捕获(HTML Media Capture). ...

  2. 达到HTTP合约Get、Post和文件上传功能——采用WinHttp介面

    于<采用WinHttp实现HTTP协议Get.Post和文件上传功能>一文中,我已经比較具体地解说了怎样使用WinHttp接口实现各种协议. 在近期的代码梳理中,我认为Post和文件上传模 ...

  3. [php基础]PHP.INI配置:文件上传功能配置教程

    昨天分享了在PHP网站开发中如何在php.ini中配置实现session功能的PHP教程,今天继续分享在利用PHP实现文件上传功能时几点关键php.ini的配置. 说到在php.ini中的文件上传的配 ...

  4. 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  5. 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  6. django之 文件上传功能(缺陷:无法改存放目录)

    百度云盘:django之 文件上传功能(缺陷:无法改存放目录)

  7. 文件/大文件上传功能实现(JS+PHP)全过程

    文件/大文件上传功能实现(JS+PHP) 参考博文:掘金-橙红年代 前端大文件上传 路漫漫 其修远 PHP + JS 实现大文件分割上传 本文是学习文件上传后的学习总结文章,从无到有实现文件上传功能, ...

  8. 使用element的upload组件实现一个完整的文件上传功能(上)

    说到标题就有点心塞了,前段时间项目上需要实现一个文件上传的功能,然后就咔咔的去用了element的upload组件,不用不知道一用吓一跳哇. 在使用的过程中遇到了很多让意想不到的问题,后来也因为时间问 ...

  9. 使用element的upload组件实现一个完整的文件上传功能(下)

    本篇文章是<使用element的upload组件实现一个完整的文件上传功能(上)>的续篇. 话不多说,接着上一篇直接开始 一.功能完善—保存表格中每一列的文件列表状态 1.思路 保存表格中 ...

随机推荐

  1. 【转】Python中执行cmd的三种方式

    原文链接:http://blog.csdn.net/menglei8625/article/details/7494094 目前我使用到的python中执行cmd的方式有三种: 1. 使用os.sys ...

  2. 习惯使用断言Assert

    一直在给党做项目,我们这些可怜兮兮的学生都没太多时间安排自己的活动了,写个blog都要在中午休息的时间. 项目用的是.NET,本来也想分享一些干货点的东西,但博客园里的前辈把这类文章已经分享泛滥了,想 ...

  3. SQL Server 查看指定表上的索引

    解决方案: sys.indexs; ---------------------------------------------------------------------------------- ...

  4. Memcached管理与监控工具 memAdmin

    http://www.junopen.com/memadmin/ 使用MemCached以后,肯定希望知道cache的效果,对于MemCached的一些运行状态进行监控是必要的,memcached提供 ...

  5. python 如何判断对象是否为类(class)

    if type(att).__name__ == 'classobj':     pass else: pass

  6. (转)IOS笔记 #pragma mark的用法

    简单的来说就是为了方便查找和导航代码用的.   下面举例如何快速的定位到我已经标识过的代码.     #pragma mark 播放节拍器 - (void) Run:(NSNumber *)tick{ ...

  7. 2014ACM/ICPC亚洲区广州站 Song Jiang's rank list

    欢迎参加——每周六晚的BestCoder(有米!) Song Jiang's rank list Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

  8. andengine游戏引擎总结进阶篇2

    本篇包括瓦片地图,物理系统, 1瓦片地图 超级玛丽,冒险岛,魂斗罗等游戏主场景都有瓦片地图画成,它的作用可见一斑,它可以用tiled Qt软件画成,在辅助篇中讲讲解tiled Qt软件的使用 1)加载 ...

  9. 机顶盒加密系统流程 ECM EMM CW SK

    随着数字视频广播(DVB)的发展.观众将面对数字电视节目的选择多.广播业因为投资成本增加,这是需要收取费用的用户观看. 有条件接收系统(Conditional Access System).它的主要功 ...

  10. 好博客分享 go需要运行容器? 不需要

    http://blog.csdn.net/wsl211511/article/details/51645324 粗浅看 Tomcat中设计模式分析 http://www.infoq.com/cn/ar ...