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. vb combobox 用法问题总结

    问题一 combobox 通过type类型,如下代码,通过选取name名称(改变combobox的名称)得到 其Id Type User id As Integer userName As Strin ...

  2. winform制作自定义控件(入门)

    原文链接:http://blog.csdn.net/bychentufeiyang/article/details/7081402   与原文基本一致,只是例子变成VS2012环境,语言采用博主常用的 ...

  3. 打造坚固的安全的Linux服务器(ssh登录篇)

      Nov 3 01:22:06 server sshd[11879]: Failed password for root from 123.127.5.131 port 38917 ssh2Nov ...

  4. Oracle EBS-SQL (PO-1):检查供货比例异常.sql

    select distinct msr.sourcing_rule_name                     名称 , msi.description                      ...

  5. jdk1.6,jdk1.7共存

    当然可以,安装的时候记得选择不同的安装目录,安装好以后,可以在开发工具(如eclipse)中切换不同的编译环境和运行环境.其实只要安装eclipse就自带了jdk1.3-1.6的编译环境了. Mac下 ...

  6. web本地存储-LocalStorage

    LocalStorage是HTML5 提供的在客户端存储数据的方法.替代但不同于之前的globalStorage,规则作用范围事先已设定好,是同一个域名(子域无效),使用同一种协议,在同一个端口上.目 ...

  7. chroot_local_user和chroot_list_enable含义

    很多情况下,我们希望限制ftp用户只能在其主目录下(root dir)下活动,不允许他们跳出主目录之外浏览服务器上 的其他目录,这时候我就需要使用到chroot_local_user,chroot_l ...

  8. nginx启动关闭

    [root@localhost sbin]# ./nginx -s reload [root@localhost sbin]# ./nginx -s stop [root@localhost sbin ...

  9. mongodb use db show dbs

    mongodb 常用命令: 在dbs间切换用 use xxxdb 之后再操作就是只针对 xxxdb了: show dbs显示全部数据库 show collections 显示全部集合 mongodb数 ...

  10. js 判断字符串中是否有某字符串

    <script> var test=['<div class="cur"></div>','<div class="cur&qu ...