post上传代码实现
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上传代码实现相关推荐
- github自己的仓库给别人上传代码的操作
点击自己工程上面的Setting 接着点击 Collaborators 中间会有一个登陆操作 输入对面的账号 点击Add collaborator , 最后也就是最关键的一步就是 复制链接给对方,让他 ...
- 使用git上传代码到github
1. github上创建项目 github是一个服务器托管商,我们写好的代码可以上传到github上面去 登录github的官方网站:http://github.com/ 注册一个自己的用户 ...
- asp.net实现ftp上传代码(解决大文件上传问题)
asp.net实现ftp上传代码(解决大文件上传问题) 参考文章: (1)asp.net实现ftp上传代码(解决大文件上传问题) (2)https://www.cnblogs.com/LYunF/ar ...
- pycharm ctrl+s ctrl+alt+shift+x 同步上传代码到服务器
ctrl+s 有时候不能同步代码到服务器,建议 对着工程目录整体 使用 ctrl + alt + shift + x 来上传文件 点击后 在鼠标位置会出现一个下拉框 选择远程服务器即可 ctrl+s ...
- IOS上传代码到CocoaPods并通过Pod下载
2019独角兽企业重金招聘Python工程师标准>>> 做的项目多了,通过CocoaPods使用第三方库的次数就越多.例如AFNetworking,SDAutoLayout,MJRe ...
- git 上传代码到指定仓库_初次使用git上传代码到github远程仓库
一.新建代码库 注册好github登录后,首先先在网页上新建代码库. 点击右上角"+"→New repository 进入如下页面:按照要求填写完成后,点击按钮创建代码库创建成功. ...
- 上传代码到gitee操作
上传代码到gitee操作 一.查看本地仓库状态 1.查看本地仓库状态 2.查看本地工作区状态 二.Git 全局设置 三.无本地仓库和本地代码时 四.已有本地git仓库时 一.查看本地仓库状态 1.查看 ...
- liunx 上传 代码到github
原文链接 原文 第一步:建立git仓库 cd到你的本地项目根目录下,执行git命令 git init 第二步:将项目的所有文件添加到仓库中 git add . 将add的文件commit到仓库 git ...
- will not add file alias already exists in index(git上传代码出错)
一 问题描述 今天在用git上传代码的时候,发现一个问题,以前从来没有遇到过,今天也是运气好,就被我碰到了,不过,每件事情有有果必有因,也是前面修改了一些文件才导致的,下面讲讲为什么会出现这个问题,然 ...
- Github上传代码截图过程
Github上传代码截图过程 首先,你得有github的账号,没有的话去注册一个:github官网:https://github.com/ 注册好了之后new一个repository,见下图: 创建好 ...
最新文章
- push to origin/master was rejected错误解决方案
- WebAPIs移动端特效——不看你就亏大了
- openresty—实现缓存前移
- TechEd 2007 HOL分享
- 高性能分布式锁-redisson
- 完美镜像ISO制作工具WinIso-----使用说明
- 锂电池充电管理芯片ic XSC01支持筋膜枪8.4V12.6V16.8充电
- 【数论】【不定方程】n元一次不定方程、佩尔方程、毕达哥拉斯定理、费马大定理
- 决策树first task之框架搭建和提出问题
- oppoa9处理器怎么样_oppoa91参数处理器怎么样
- QQ机器人 微信机器人最新可用框架汇总
- 哪一款蓝牙耳机音质最好?2023发烧级音质蓝牙耳机推荐
- Mosquitto设置用户名密码
- EXCEL中,不能调整行高。当把行高拉到409的时候就不能再拉高了,是什么原因?
- three.js 07-06 之 Sprite 一幅图片多个精灵
- vmei-day04-Jcenter方式集成极光推送
- 第四讲 switch结构和循环(switch结构、while循环、do-while循环)
- 433M串口模块无线通信(STM32)
- 微信内置浏览器第三方登录qq
- 浦东新区企业研发机构认定奖励50万政策解读
热门文章
- python canvas获取的图片流数据为空
- 怎么让热图显示基因名_R 生信数据可视化 01 | 聚类热图
- 时间序列分类算法简介及其在能耗数据分类上的应用
- Part 1 — Introduction to Smart (legal?) Contracts
- 【David Silver强化学习公开课】-4:Model-Free Prediction
- 区块链基础知识系列 第三课 区块链中的默克尔树
- 高校二手交易代码_@21考研er:985高校捡漏指南!这些专业去年都没招满!!
- c语言作业指导1,C语言程序设计实验与习题指导
- 合法的python变量名import_python 环境变量和import模块导入方法(详解)
- python中for循环语句格式_Python基础-10循环语句