iOS开发网络篇—文件的上传

说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中。本文介绍如何不借助第三方框架实现iOS开发中得文件上传。

  由于过程较为复杂,因此本文只贴出部分关键代码。

主控制器的关键代码:

YYViewController.m

 1 #import "YYViewController.h"
 2 
 3 #define YYEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding]
 4 
 5 @interface YYViewController ()
 6 
 7 @end
 8 
 9 @implementation YYViewController
10 
11 - (void)viewDidLoad
12 {
13     [super viewDidLoad];
14     // Do any additional setup after loading the view, typically from a nib.
15 }
16 
17 - (void)upload:(NSString *)name filename:(NSString *)filename mimeType:(NSString *)mimeType data:(NSData *)data parmas:(NSDictionary *)params
18 {
19     // 文件上传
20     NSURL *url = [NSURL URLWithString:@"http://192.168.1.200:8080/YYServer/upload"];
21     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
22     request.HTTPMethod = @"POST";
23     
24     // 设置请求体
25     NSMutableData *body = [NSMutableData data];
26     
27     /***************文件参数***************/
28     // 参数开始的标志
29     [body appendData:YYEncode(@"--YY\r\n")];
30     // name : 指定参数名(必须跟服务器端保持一致)
31     // filename : 文件名
32     NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", name, filename];
33     [body appendData:YYEncode(disposition)];
34     NSString *type = [NSString stringWithFormat:@"Content-Type: %@\r\n", mimeType];
35     [body appendData:YYEncode(type)];
36     
37     [body appendData:YYEncode(@"\r\n")];
38     [body appendData:data];
39     [body appendData:YYEncode(@"\r\n")];
40     
41     /***************普通参数***************/
42     [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
43         // 参数开始的标志
44         [body appendData:YYEncode(@"--YY\r\n")];
45         NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n", key];
46         [body appendData:YYEncode(disposition)];
47 
48         [body appendData:YYEncode(@"\r\n")];
49         [body appendData:YYEncode(obj)];
50         [body appendData:YYEncode(@"\r\n")];
51     }];
52     
53     /***************参数结束***************/
54     // YY--\r\n
55     [body appendData:YYEncode(@"--YY--\r\n")];
56     request.HTTPBody = body;
57     
58     // 设置请求头
59     // 请求体的长度
60     [request setValue:[NSString stringWithFormat:@"%zd", body.length] forHTTPHeaderField:@"Content-Length"];
61     // 声明这个POST请求是个文件上传
62     [request setValue:@"multipart/form-data; boundary=YY" forHTTPHeaderField:@"Content-Type"];
63     
64     // 发送请求
65     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
66         if (data) {
67             NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
68             NSLog(@"%@", dict);
69         } else {
70             NSLog(@"上传失败");
71         }
72     }];
73 }
74 
75 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
76 {
77     // Socket 实现断点上传
78     
79     //apache-tomcat-6.0.41/conf/web.xml 查找 文件的 mimeType
80 //    UIImage *image = [UIImage imageNamed:@"test"];
81 //    NSData *filedata = UIImagePNGRepresentation(image);
82 //    [self upload:@"file" filename:@"test.png" mimeType:@"image/png" data:filedata parmas:@{@"username" : @"123"}];
83     
84     // 给本地文件发送一个请求
85     NSURL *fileurl = [[NSBundle mainBundle] URLForResource:@"itcast.txt" withExtension:nil];
86     NSURLRequest *request = [NSURLRequest requestWithURL:fileurl];
87     NSURLResponse *repsonse = nil;
88     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&repsonse error:nil];
89     
90     // 得到mimeType
91     NSLog(@"%@", repsonse.MIMEType);
92     [self upload:@"file" filename:@"itcast.txt" mimeType:repsonse.MIMEType data:data parmas:@{
93                                                                                               @"username" : @"999",
94                                                                                               @"type" : @"XML"}];
95 }
96 
97 @end

补充说明:

文件上传请求数据格式

部分文件的MIMEType

转载于:https://www.cnblogs.com/zengshuilin/p/5764419.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

var模型的matlab实现_Eviews中VAR模型的操作、脉冲响应分析和方差分解的实现

打开文件所在位置,获取数据。选中变量右键open打开var操作EViews,在VAR对象的工具栏中选择“View”|“Lag Structure”|“AR Roots Table/ AR Roots Graph”选项,得到AR根的表和图。结果显示:VAR模型所有根模的倒数都小于1,即都在…

结构体、枚举类型

一、结构体 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样。 1、定义的方法: struct student { public int nianling; public int fenshu; public string name; public string sex; public int sum; …

NXP KW38开发杂记(一)MCUXpress 运行进入NMI_Handler

这里是大佬的具体分析过程,感兴趣可以看看 https://www.cnblogs.com/wenhao-Web/p/13618703.html 解决办法: 在startup_mkw38a4.c文件里,定位到Flash_Config {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFE}; 把最后一个参数0xFFFFFFFE改…

25个让Java程序员更高效的Eclipse插件

Eclipse提供了一个可扩展插件的开发系统。这就使得Eclipse在运行系统之上可以实现各种功能。这些插件也不同于其他的应用(插件的功能是最难用代码实现的)。拥有合适的Eclipse插件是非常重要的,因为它们能让Java开发者们无缝的开发基于J2EE和服…

NXP KW38蓝牙开发(一)入门第一课:官网蓝牙广播和连接例程,NMI禁止

首先要下载开发使用的IDE:MCUXpresso IDE 下载链接: 进入nxp的官网,搜索KW38 向下翻看,找到Xpresso,点击进入 习惯使用IAR开发的同学也可以下IAR版本,这里以Xpresso为例 下载好后安装,一路默…

views 多个文件夹 netcore_.NET Core中的使用Kestrel服务器理解及应用

Kestrel是一个基于libuv的跨平台.NET Core web服务器,libuv是一个跨平台的异步I/O库。ASP.NET Core模板项目使用Kestrel作为默认的web服务器。Kestrel支持以下功能:HTTPS用于启用不透明升级的WebSockets位于Nginx之后的高性能Unix socketsKestrel 被.NET…

NXP UWB NCJ29D5开发(一)环境搭建

1、从NXP的共享账号下载资料 共享账号需要找对接的NXP人员拿到,他会把资料分享到这个账号,在这个账号里面可以下载 进入nxp官网,登录后点击my nxp,选择Software Licensing and Support 进入后接着选择View accounts 进入后选择…

Stack的三种含义

作者:阮一峰 学习编程的时候,经常会看到stack这个词,它的中文名字叫做”栈”。 理解这个概念,对于理解程序的运行至关重要。容易混淆的是,这个词其实有三种含义,适用于不同的场合,必须加以区分。…

NXP UWB NCJ29D5开发(二)BlinkyLed例程

路径为UWB\NCJ29D5\NCJ29D5_CAS_Examples_v1.4\onic\BlinkyLed\toolsupport\keil 例程怎么来的可以看看上一篇NXP UWB NCJ29D5开发(一)环境搭建 1、 //系统选择外部晶振,时钟频率为55.2Mhz phscaAppHal_Init(PHSCA_APPHAL_XO_CLOCK_SOURCE_…

强肝保肝养肝4大食物

“强肝的食物,保肝的食物有哪些,养肝的食物有哪些”如果您对这些食物不了解不明白。那就看看专家为您推荐的四款强肝保肝养肝的食物。荔枝(供图/华盖)一、是荔枝,荔枝可以保肝,对肝有好处根据《本草纲目》记载荔枝有强肝健胰的效果…

如何查看注解实现_该怎么运用注解呢?Java团队元老有话说

来源 | 异步 15讲能学好诞生24年的JAVA吗?你当然会感到怀疑,众所周知,在技术向的IT论坛上,“如何在十天之内快速掌握好Java?”这类问题,往往会招来嘲笑。来源于知乎但在当下,5分钟能看完一部电影…

NXP S32K144开发(一)环境搭建和新建工程

1、首先需要安装S32 Design Studio for ARM,在NXP官网可以搜索到,这玩意也是基于eclipse的 安装好后就可以打开了。 2、新建工程 过程可以参考NXP官网: https://www.nxp.com/document/guide/get-started-with-the-s32k144evb:NGS-S32K144E…

首先记录异常的根本原因

Logback日志库的0.9.30版本带来了一个很棒的新功能:从根(最内部)异常而不是最外部异常开始记录堆栈跟踪。 当然,我的兴奋与我贡献了此功能无关。 用塞西尔德米勒(Cecil B. de Mille) 的话来解释&#xff1a…

Android 中的 Service 全面总结

1、Service的种类 按运行地点分类: 类别区别 优点缺点 应用本地服务(Local)该服务依附在主进程上, 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不…

找出互联网类似以下图的实例

转载于:https://www.cnblogs.com/sghcjy/p/4978851.html

使用Spring MVC开发Restful Web服务

REST简介 摘自Wikipedia: REST风格的体系结构由客户端和服务器组成。 客户端向服务器发起请求; 服务器处理请求并返回适当的响应。 请求和响应围绕资源表示的传递而构建。 资源本质上可以是可以解决的任何连贯且有意义的概念。 正如您所阅读的&#xff0…

端到端测试的滥用–测试技术2

我的上一个博客是有关测试代码方法的一系列博客中的第一篇,概述了使用一种非常常见的模式从数据库检索地址的简单方案: …并描述了一种非常通用的测试技术: 不编写测试 , 而是手动进行所有操作。 今天的博客涵盖了另一种实践&…

那些年困扰我们的Linux 的蠕虫、病毒和木马

虽然针对Linux的恶意软件并不像针对Windows乃至OS X那样普遍,但是近些年来,Linux面临的安全威胁却变得越来越多、越来越严重。个中原因包括,手机爆炸性的普及意味着基于Linux的安卓成为恶意黑 客最具吸引力的目标之一,以及使用Lin…

(转)FPGA异步时序和多时钟模块

http://bbs.ednchina.com/BLOG_ARTICLE_3019907.HTM 第六章 时钟域 有一个有趣的现象,众多数字设计特别是与FPGA设计相关的教科书都特别强调整个设计最好采用唯一的时钟域。换句话说,只有一个独立的网络可以驱动一个设计中所有触发器的时钟端口。虽然…

怎么检测不到我的音频_Linux 上的最佳音频编辑工具推荐 | Linux 中国

在 Linux 上,有很多种音频编辑器可供你选用。不论你是一个专业的音乐制作人,还是只想学学怎么做出超棒的音乐的爱好者,这些强大的音频编辑器都是很有用的工具。-- Ankush Das(作者)在 Linux 上,有很多种音频编辑器可供你选用。不论…