post传递普通账号密码时候,数据包含在请求体中。在上传文件的时候同样如此。当一个服务器接收到上传指令。假设发送一个简单的txt,此时客户端整体发送给服务器的数据包含两大类:

  两者加起来就是完整的发送给服务器的二级制数据的组成格式。由于W3C制定了标准格式,并且apple没有封装。所有如果在IOS中,实现POST上传文件,需要拼接数据成上述格式才能实现(java  .net都封装了...)。

  但是IOS有第三方框架。AFN能够实现同时上传一个文件,有时候的格式还无法上传。ASI能实现多个上传(MRC--2012停止更新--设计的目标平台是IOS2.0/3.0)。

番外篇:

  在以前的服务器中,服务器价格往往昂贵。网站基本会限制上传或者批量上传。例如照片不能超多多少M,只能单张传递(年轻的QQ控件)。随着现今云服务器的普及,软件开发商希望获得更多的用户数据,所以上传下载批量实现在移动互联端也很重要。

  此时 出现了一种交 UGC(用户生成内容)的应用。(网易新闻,糗事百科,微博等等等)---想要把软件做好,就要鼓励用户生成内容。(这就是评论,弹幕的魅力),官方软件总有力竭的一天。而用户是无穷的。各类微博基本都是靠名人效应吸引大家,然后数据大部分来自用户。

  垂直社交软件:三大移动巨头的用户是很多很多的。而这个世界上的用户是无穷的。垂直社交app现在也是很高大上。骑行,羽毛球,爬山,穷游,酒吧。一群人的圈子不会仅限于微信贴吧。有专属的权威的APP,大家肯定更喜欢用。

继续POST: 

  如上content-Type为Xcode实现上传必须拼接的数据,两个加起来就是一个完整的二进制数据。

  盗用刀哥一段总结,已经超越了我网络工程的忧郁专门门槛

 1 Content-Type: multipart/form-data; boundary(分隔线)=(可以随便写,ASCII,字母和数字)
 2
 3 ## 注释
 4
 5 * userfile => 负责上传文件脚本中的 字段名,开发的时候,可以咨询后端程序员
 6 * filename => 将文件保存在服务器上的文件名称
 7 * Content-Type: 客户端告诉服务器上传文件的文件类型
 8     - 大类型/小类型
 9     - text/plain
10     - image/jpg
11     - image/png
12     - image/gif
13     - text/html
14     - application/json
15
16     - application/octet-stream(8进制流),如果不想告诉服务器具体的文件类型,可以使用这个 Content-Type
17
18 * 注意:每一行末尾需要有一定的 \r\n
19 * 提示:有些服务器可以直接使用 \n,但是新浪微博如果使用 \n 上传文件,服务器会返回“没有权限”的错误!
20
21 ## 上传单个文件
22
23 --boundary\r\n
24 Content-Disposition: form-data; name="userfile"; filename="aaa.txt"\r\n
25 Content-Type: application/octet-stream\r\n\r\n
26
27 要上传文件的二进制数据
28
29 \r\n--boundary--
30
31
32 ## 上传多个文件
33
34 * 有些服务器可以在上传文件的同时,提交一些文本内容给服务器
35 * 典型应用:新浪微博,上传图片的同时,发送一个微博!
36
37
38 Content-Type: multipart/form-data; boundary=boundary
39
40 // ------ 以下内容,是提价给服务器的二进制数据格式
41 --boundary\r\n
42 Content-Disposition: form-data; name="userfile[]"; filename="aaa.txt"\r\n
43 Content-Type: application/octet-stream\r\n\r\n
44
45 二进制数据
46 \r\n
47 --boundary\r\n
48 Content-Disposition: form-data; name="userfile[]"; filename="aaa副本.txt"\r\n
49 Content-Type: application/octet-stream\r\n\r\n
50
51 二进制数据
52 \r\n
53 --boundary\r\n
54 // status 是脚本文件接收参数的名称
55 Content-Disposition: form-data; name="status"\r\n\r\n
56
57 二进制数据
58 \r\n
59 --boundary--
60 // ------

OC实现:

  (1)三步完成请求发送

  (2)单独封装请求体拼接方法

  (3)触摸调动方法

 1 static NSString *boundary = @"aixiaoxin";
 2
 3 - (void)upLoad:(NSString *)field fileName:(NSString *)fileName data:(NSData *)data{
 4
 5     // 发送请求
 6     NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/post/upload.php"];
 7
 8     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:10.0];
 9
10     // 设置请求类型
11     request.HTTPMethod = @"POST";
12
13     // 设置请求体
14     // field是后台要的一个数据(html中依据这个接收)
15     // fileName是要保存的文件名
16     // data就是你要上传的文件的二进制形式
17     request.HTTPBody = [self httpBody:field fileName:fileName data:data];
18
19     // POST上传此时还要多一个content-type类型,用kvc
20     //Content-Type: multipart/form-data; boundary(分隔线)=(可以随便写,ASCII,字母和数字)
21     [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField:@"Content-Type"];
22
23     // Connection异步主队列发送请求
24     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
25         // 这是一个json
26         NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
27         NSLog(@"%@",dic);
28     }];
29
30
31
32 }

 1 - (NSData *)httpBody:(NSString *)field fileName:(NSString *)fileName data:(NSData *)data{
 2
 3     NSMutableData *dataM = [NSMutableData data];
 4
 5     //按照W3C规定的发送给服务器的格式拼接数据
 6     /*
 7      --boundary\r\n
 8      Content-Disposition: form-data; name="userfile"; filename="aaa.txt"\r\n
 9      Content-Type: application/octet-stream\r\n\r\n
10
11      要上传文件的二进制数据
12
13      \r\n--boundary--
14
15      */
16
17     NSMutableString *strM = [NSMutableString stringWithFormat:@"--%@\r\n", boundary];
18     [strM appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", field, fileName];
19     [strM appendString:@"Content-Type: application/octet-stream\r\n\r\n"];
20
21     [dataM appendData:[strM dataUsingEncoding:NSUTF8StringEncoding]];
22     [dataM appendData:data];
23
24     NSString *tail = [NSString stringWithFormat:@"\r\n--%@--", boundary];
25     [dataM appendData:[tail dataUsingEncoding:NSUTF8StringEncoding]];
26
27     return [dataM copy];
28
29
30 }

 1 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
 2
 3     // 测试要上传到服务器的图片转化成二进制
 4     NSString *imgStr = [[NSBundle mainBundle]pathForResource:@"1.jpg" ofType:nil];
 5     NSData *imgData = [NSData dataWithContentsOfFile:imgStr];
 6
 7     // 调用方法
 8     [self upLoad:@"userfile" fileName:@"我是上传的文件.png" data:imgData];
 9
10 }

  完成后可看到结论代码:

  分析:error = 0说明上传成功

     name没有转码,因为设定是中文,但是是.png可以看出确实是一个图片

     size大小12260

     tmp_name貌似每次名字都不一样,应该是在沙盒中?--不太清楚

     type是类型,application/octet-stream说明不需要让服务器知道上传的是什么类型,或者imgae/png来上传png图片也可以

  此时在服务器中就可以看到了

转载于:https://www.cnblogs.com/aixiaoxin/p/4665053.html

post上传代码实现相关推荐

  1. github自己的仓库给别人上传代码的操作

    点击自己工程上面的Setting 接着点击 Collaborators 中间会有一个登陆操作 输入对面的账号 点击Add collaborator , 最后也就是最关键的一步就是 复制链接给对方,让他 ...

  2. 使用git上传代码到github

    1.      github上创建项目 github是一个服务器托管商,我们写好的代码可以上传到github上面去 登录github的官方网站:http://github.com/ 注册一个自己的用户 ...

  3. asp.net实现ftp上传代码(解决大文件上传问题)

    asp.net实现ftp上传代码(解决大文件上传问题) 参考文章: (1)asp.net实现ftp上传代码(解决大文件上传问题) (2)https://www.cnblogs.com/LYunF/ar ...

  4. pycharm ctrl+s ctrl+alt+shift+x 同步上传代码到服务器

    ctrl+s 有时候不能同步代码到服务器,建议 对着工程目录整体 使用 ctrl + alt + shift + x 来上传文件 点击后 在鼠标位置会出现一个下拉框 选择远程服务器即可 ctrl+s ...

  5. IOS上传代码到CocoaPods并通过Pod下载

    2019独角兽企业重金招聘Python工程师标准>>> 做的项目多了,通过CocoaPods使用第三方库的次数就越多.例如AFNetworking,SDAutoLayout,MJRe ...

  6. git 上传代码到指定仓库_初次使用git上传代码到github远程仓库

    一.新建代码库 注册好github登录后,首先先在网页上新建代码库. 点击右上角"+"→New repository 进入如下页面:按照要求填写完成后,点击按钮创建代码库创建成功. ...

  7. 上传代码到gitee操作

    上传代码到gitee操作 一.查看本地仓库状态 1.查看本地仓库状态 2.查看本地工作区状态 二.Git 全局设置 三.无本地仓库和本地代码时 四.已有本地git仓库时 一.查看本地仓库状态 1.查看 ...

  8. liunx 上传 代码到github

    原文链接 原文 第一步:建立git仓库 cd到你的本地项目根目录下,执行git命令 git init 第二步:将项目的所有文件添加到仓库中 git add . 将add的文件commit到仓库 git ...

  9. will not add file alias already exists in index(git上传代码出错)

    一 问题描述 今天在用git上传代码的时候,发现一个问题,以前从来没有遇到过,今天也是运气好,就被我碰到了,不过,每件事情有有果必有因,也是前面修改了一些文件才导致的,下面讲讲为什么会出现这个问题,然 ...

  10. Github上传代码截图过程

    Github上传代码截图过程 首先,你得有github的账号,没有的话去注册一个:github官网:https://github.com/ 注册好了之后new一个repository,见下图: 创建好 ...

最新文章

  1. push to origin/master was rejected错误解决方案
  2. WebAPIs移动端特效——不看你就亏大了
  3. openresty—实现缓存前移
  4. TechEd 2007 HOL分享
  5. 高性能分布式锁-redisson
  6. 完美镜像ISO制作工具WinIso-----使用说明
  7. 锂电池充电管理芯片ic XSC01支持筋膜枪8.4V12.6V16.8充电
  8. 【数论】【不定方程】n元一次不定方程、佩尔方程、毕达哥拉斯定理、费马大定理
  9. 决策树first task之框架搭建和提出问题
  10. oppoa9处理器怎么样_oppoa91参数处理器怎么样
  11. QQ机器人 微信机器人最新可用框架汇总
  12. 哪一款蓝牙耳机音质最好?2023发烧级音质蓝牙耳机推荐
  13. Mosquitto设置用户名密码
  14. EXCEL中,不能调整行高。当把行高拉到409的时候就不能再拉高了,是什么原因?
  15. three.js 07-06 之 Sprite 一幅图片多个精灵
  16. vmei-day04-Jcenter方式集成极光推送
  17. 第四讲 switch结构和循环(switch结构、while循环、do-while循环)
  18. 433M串口模块无线通信(STM32)
  19. 微信内置浏览器第三方登录qq
  20. 浦东新区企业研发机构认定奖励50万政策解读

热门文章

  1. python canvas获取的图片流数据为空
  2. 怎么让热图显示基因名_R 生信数据可视化 01 | 聚类热图
  3. 时间序列分类算法简介及其在能耗数据分类上的应用
  4. Part 1 — Introduction to Smart (legal?) Contracts
  5. 【David Silver强化学习公开课】-4:Model-Free Prediction
  6. 区块链基础知识系列 第三课 区块链中的默克尔树
  7. 高校二手交易代码_@21考研er:985高校捡漏指南!这些专业去年都没招满!!
  8. c语言作业指导1,C语言程序设计实验与习题指导
  9. 合法的python变量名import_python 环境变量和import模块导入方法(详解)
  10. python中for循环语句格式_Python基础-10循环语句