iOS实现文件上传功能模块
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实现文件上传功能模块的更多相关文章
- iOS 的 Safari 文件上传功能详解
iOS 6 给 Safari 浏览器带来的另外一个功能是文件上传,终于 Safari 终于支持 input 输入框的文件类型了,并且还支持 HTML媒体捕获(HTML Media Capture). ...
- 达到HTTP合约Get、Post和文件上传功能——采用WinHttp介面
于<采用WinHttp实现HTTP协议Get.Post和文件上传功能>一文中,我已经比較具体地解说了怎样使用WinHttp接口实现各种协议. 在近期的代码梳理中,我认为Post和文件上传模 ...
- [php基础]PHP.INI配置:文件上传功能配置教程
昨天分享了在PHP网站开发中如何在php.ini中配置实现session功能的PHP教程,今天继续分享在利用PHP实现文件上传功能时几点关键php.ini的配置. 说到在php.ini中的文件上传的配 ...
- 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- django之 文件上传功能(缺陷:无法改存放目录)
百度云盘:django之 文件上传功能(缺陷:无法改存放目录)
- 文件/大文件上传功能实现(JS+PHP)全过程
文件/大文件上传功能实现(JS+PHP) 参考博文:掘金-橙红年代 前端大文件上传 路漫漫 其修远 PHP + JS 实现大文件分割上传 本文是学习文件上传后的学习总结文章,从无到有实现文件上传功能, ...
- 使用element的upload组件实现一个完整的文件上传功能(上)
说到标题就有点心塞了,前段时间项目上需要实现一个文件上传的功能,然后就咔咔的去用了element的upload组件,不用不知道一用吓一跳哇. 在使用的过程中遇到了很多让意想不到的问题,后来也因为时间问 ...
- 使用element的upload组件实现一个完整的文件上传功能(下)
本篇文章是<使用element的upload组件实现一个完整的文件上传功能(上)>的续篇. 话不多说,接着上一篇直接开始 一.功能完善—保存表格中每一列的文件列表状态 1.思路 保存表格中 ...
随机推荐
- 【转】Python中执行cmd的三种方式
原文链接:http://blog.csdn.net/menglei8625/article/details/7494094 目前我使用到的python中执行cmd的方式有三种: 1. 使用os.sys ...
- 习惯使用断言Assert
一直在给党做项目,我们这些可怜兮兮的学生都没太多时间安排自己的活动了,写个blog都要在中午休息的时间. 项目用的是.NET,本来也想分享一些干货点的东西,但博客园里的前辈把这类文章已经分享泛滥了,想 ...
- SQL Server 查看指定表上的索引
解决方案: sys.indexs; ---------------------------------------------------------------------------------- ...
- Memcached管理与监控工具 memAdmin
http://www.junopen.com/memadmin/ 使用MemCached以后,肯定希望知道cache的效果,对于MemCached的一些运行状态进行监控是必要的,memcached提供 ...
- python 如何判断对象是否为类(class)
if type(att).__name__ == 'classobj': pass else: pass
- (转)IOS笔记 #pragma mark的用法
简单的来说就是为了方便查找和导航代码用的. 下面举例如何快速的定位到我已经标识过的代码. #pragma mark 播放节拍器 - (void) Run:(NSNumber *)tick{ ...
- 2014ACM/ICPC亚洲区广州站 Song Jiang's rank list
欢迎参加——每周六晚的BestCoder(有米!) Song Jiang's rank list Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- andengine游戏引擎总结进阶篇2
本篇包括瓦片地图,物理系统, 1瓦片地图 超级玛丽,冒险岛,魂斗罗等游戏主场景都有瓦片地图画成,它的作用可见一斑,它可以用tiled Qt软件画成,在辅助篇中讲讲解tiled Qt软件的使用 1)加载 ...
- 机顶盒加密系统流程 ECM EMM CW SK
随着数字视频广播(DVB)的发展.观众将面对数字电视节目的选择多.广播业因为投资成本增加,这是需要收取费用的用户观看. 有条件接收系统(Conditional Access System).它的主要功 ...
- 好博客分享 go需要运行容器? 不需要
http://blog.csdn.net/wsl211511/article/details/51645324 粗浅看 Tomcat中设计模式分析 http://www.infoq.com/cn/ar ...