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学习day2(二)

    1.类与对象的关系 对于Python,一切事物都是对象,对象基于类创建 type是获取类的 dir是获取这个类里面的成员 2.int内部功能介绍 bit_length:返回表示当前数字占用的最少位数: ...

  2. C++ dynamic_cast实现原理

    dynamic_cast是一个操作符,其用法不再赘述.查看汇编码可以发现实际调用的是这个函数__RTDynamicCast,其内部实现如下: rtti.h: #pragma once extern & ...

  3. android4.0 HttpClient 以后不能在主线程发起网络请求

    android4.0以后不能在主线程发起网络请求,该异步网络请求. new Thread(new Runnable() { @Override public void run() { // TODO ...

  4. ecshop后台添加菜单项,权限问题

    ecshop后台自定义菜单涉及到几个重要的权限控制的文件,先做如下总结: 后台添加菜单项,并设置权限的步骤.:(以在系统模块添加申请友链菜单为例)commn.php       : \language ...

  5. 【转载】详解java类的生命周期

    原文地址:http://blog.csdn.net/zhengzhb/article/details/7517213 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑, ...

  6. Java DES 加密和解密源码(转)

    原文地址:http://www.oschina.net/code/snippet_727646_18383 Java密码学结构设计遵循两个原则: 1) 算法的独立性和可靠性. 2) 实现的独立性和相互 ...

  7. /var/cache/apt/archives/lock - open

    问题: E: 无法获得锁 /var/cache/apt/archives/lock - open (11 资源临时不可用)E: 无法锁定下载目录o rm /var/cache/apt/archives ...

  8. CSS中zoom和scale的区别

    zoom和scale这两个东西都是用于对元素的缩放,但两者除了兼容性之外还有一些不同的地方.zoom缩放会将元素保持在左上角,而scale默认是中间位置,可以通过transform-origin来设置 ...

  9. Repeater获取某一行TextBox值

    TextBox tb = (TextBox)e.Item.FindControl("TextBoxID");

  10. 使用sqlcmd执行连接的时候一直报有语法错误

    1.今天在使用sqlcmd进行执行连接操作的时候一直报有语法错误找了半天. 命令 sqlcmd -S 服务器名称 -U 帐户 -P 密码 示例 sqlcmd -S "LOCALHOST&qu ...