概述

Http协议对文件上传协议要求的

1. 必须设置请求头Content-Type为multipart/form-data。在iOS中后面需要跟上分隔符比如:boundary=----WebKitFormBoundaryDYeXSvJz9Yuyf6Du。分割可以任意字符

2. 上传的参数是有要求的,具体的数据格式如下

如果请求头没有设置Content-Type为multipart/form-data则为普通的POST请求。

文件上传

通过NSURLConnection上传文件

#define FMDataWithString(Str) [Str dataUsingEncoding:NSUTF8StringEncoding]
#define FMNewLine FMDataWithString(@"\r\n") // #define FMSeparator @"----WebKitFormBoundaryt8fVxWuv0hn9uOjt" 分隔符 @interface ViewController ()
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 设置POST请求
request.HTTPMethod = @"POST";
// 上传的请求头必须参数设置
[request setValue:@"multipart/form-data; boundary=----WebKitFormBoundaryt8fVxWuv0hn9uOjt" forHTTPHeaderField:@"Content-Type"]; // 处理请求体
request.HTTPBody = [self handleHttpBody]; // 发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { NSLog(@"-------------%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}]; } - (NSMutableData *)handleHttpBody
{
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"Snip20180325_5"], 1.0); NSMutableData *httpBodyData = [NSMutableData data]; [httpBodyData appendData:FMDataWithString(@"------WebKitFormBoundaryt8fVxWuv0hn9uOjt")]; [httpBodyData appendData:FMNewLine];
[httpBodyData appendData:FMDataWithString(@"Content-Disposition: form-data; name=\"file\"; filename=\"Snip20180325_11.png\"")]; [httpBodyData appendData:FMNewLine];
[httpBodyData appendData:FMDataWithString(@"Content-Type: image/png")]; [httpBodyData appendData:FMNewLine];
[httpBodyData appendData:FMNewLine];
[httpBodyData appendData:imageData]; [httpBodyData appendData:FMNewLine];
[httpBodyData appendData:FMNewLine]; // 非文件参数
[httpBodyData appendData:FMDataWithString(@"------WebKitFormBoundaryt8fVxWuv0hn9uOjt")]; [httpBodyData appendData:FMNewLine];
[httpBodyData appendData:FMDataWithString(@"Content-Disposition: form-data; name=\"username\"")]; [httpBodyData appendData:FMNewLine];
[httpBodyData appendData:FMNewLine];
[httpBodyData appendData:FMDataWithString(@"tom")]; [httpBodyData appendData:FMNewLine]; // 结束分隔符
[httpBodyData appendData:FMDataWithString(@"------WebKitFormBoundaryt8fVxWuv0hn9uOjt--")]; return httpBodyData;
}
@end

NSURLSession上传文件

使用NSURLSession上传文件跟NSURLConnection对比两者步骤差不多,只是请求体的位置不一样。NSURLConnection数据是放在request中。NSURLSession放在参数中;

NSURLSessionUploadTask *task = [[NSURLSession sharedSession] uploadTaskWithRequest:request fromData:[self handleHttpBody] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"-------------%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];

AFNetworking文件上传

NSDictionary *param = @{@"username": @"CoderHong"};
[[AFHTTPSessionManager manager] POST:@"http://120.25.226.186:32812/upload" parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
/**
设置需要上传的文件
@param name 服务器字段名
@param fileName 要传递的文件名
@param mimeType 文件的mimetype
*/
[formData appendPartWithFileData:UIImageJPEGRepresentation([UIImage imageNamed:@"Snip20180325_5"], 1.0) name:@"file" fileName:@"Snip20180325_5.png" mimeType:@"image/png"]; // 通过传递文件的路径
// [formData appendPartWithFileURL:[NSURL fileURLWithPath:@""] name:@"file" fileName:@"Snip20180325_5" mimeType:@"image/png" error:nil];
// [formData appendPartWithFileURL:[NSURL fileURLWithPath:@""] name:@"file" error:nil]; } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"-----------%@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { }];

iOS开发系列-文件上传的更多相关文章

  1. Java开发系列-文件上传

    概述 Java开发中文件上传的方式有很多,常见的有servlet3.0.common-fileUpload.框架.不管哪种方式,对于文件上传的本质是不变的. 文件上传的准备 文件上传需要客户端跟服务都 ...

  2. 【转】 iOS开发之打包上传到App Store——(一)各种证书的理解

    OK,有日子没写iOS开发的相关文章啦,主要是最近的精力都没在这上面,不过既然产品已经快要出来了,就有必要了解一下各种证书啥的(众所周知iOS的一堆证书可是很让人头大呀),最近确实被这个搞得头大,然后 ...

  3. SpringBoot | 第十七章:web应用开发之文件上传

    前言 上一章节,我们讲解了利用模版引擎实现前端页面渲染,从而实现动态网页的功能,同时也提出了兼容jsp项目的解决方案.既然开始讲解web开发了,我们就接着继续往web这个方向继续吧.通常,我们在做we ...

  4. SpringBoot --web 应用开发之文件上传

    原文出处: oKong 前言 上一章节,我们讲解了利用模版引擎实现前端页面渲染,从而实现动态网页的功能,同时也提出了兼容jsp项目的解决方案.既然开始讲解web开发了,我们就接着继续往web这个方向继 ...

  5. 04springMVC结构,mvc模式,spring-mvc流程,spring-mvc的第一个例子,三种handlerMapping,几种控制器,springmvc基于注解的开发,文件上传,拦截器,s

     1. Spring-mvc介绍 1.1市面上流行的框架 Struts2(比较多) Springmvc(比较多而且属于上升的趋势) Struts1(即将被淘汰) 其他 1.2  spring-mv ...

  6. Java开发之文件上传

    文件上传有SmartUpload.Apache的Commons fileupload.我们今天介绍Commons fileupload的用法. 1.commons-fileupload-1.3.1.j ...

  7. Web 开发中 文件上传 是出现的:java.io.FileNotFoundException: (文件名、目录名或卷标语法不正确。)

    <span style="font-family: Arial, Helvetica, sans-serif; "> </span> <span st ...

  8. Egg.js学习与实战系列 · 文件上传配置

    在使用Egg.js搭建文件上传服务时,遇到了几个一般新手都会遇到的坑. 经查阅官方文档,Egg框架中默认使用egg-multipart插件进行文件上传,所以上传文件前需要做相关的配置. 上传文件提示: ...

  9. Baidu WebFE(FEX)团队开发 的 文件上传插件 WebUploader

    1.webUploader官网下载地址:http://fex.baidu.com/webuploader/ 直接下载代码,运行examples目录文件即可 2.webUploader上传demo:ht ...

随机推荐

  1. 【Codeforces 1185C2】Exam in BerSU (hard version)

    [链接] 我是链接,点我呀:) [题意] 要让前i个数字的和小于等于M. 问你最少要删掉前i-1个数字中的多少个数字,每个询问都是独立的. [题解] ti的范围很小. 所以N*MAX(TI)暴力枚举就 ...

  2. mysql中的Date日期格式的问题:只有日期没有时间及格式化时间

    只有日期没有时间,把xml中的date改为timestamp 格式化最简单的方法:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", time ...

  3. web应用本质

    web应用的本质 在之前学习的socket网络编程中,是基于: 架构:C/S架构 协议:TCP/UDP协议 运行在OSI七层模型中的传输层 那么在web应用中,是基于: 架构:B/S架构 协议:Htt ...

  4. class9_Menubar 菜单

    最终的运行效果图(程序见序号5) #!/usr/bin/env python# -*- coding:utf-8 -*-# -------------------------------------- ...

  5. CodeForces 1166D Cute Sequences

    题目链接:http://codeforces.com/problemset/problem/1166/D 题目大意 给定序列的第一个元素 a 和最后一个元素 b 还有一个限制 m,请构造一个序列,序列 ...

  6. mysql分区管理语句

    1.key分区语句: ALTER TABLE order_info PARTITION BY KEY(orderSn) PARTITIONS 127; 2.rang分区语句: ALTER TABLE ...

  7. 春节跳槽最新Java面试题及答案整理

    今天大部分码农同学已经上班了吧,最近也是跳槽人才流动的高峰期,拿了年终奖,找找更好的机会. 小编也面了几家公司了,回来整理下面经分享给大家做个参考.有很多,暂时先分享20道,后续更多会陆续整理分享出来 ...

  8. cvErode和cvDilate腐蚀和膨胀函数

    Erode腐蚀,Dilate膨胀,这两个形态学函数总是成对出现,前者可以消除较小独点如噪音,后者可以使不连通的图像合并成块. void cvErode( const CvArr* src, CvArr ...

  9. Android开发 多媒体提取器MediaExtractor详解_将一个视频文件分离视频与音频

    前言 此篇博客讲解MediaExtractor将一个视频文件分离视频与音频,如果你对MediaExtractor还没有一个笼统的概念建议先了解我的另一篇入门博客:https://www.cnblogs ...

  10. 【JZOJ4665】数列

    description analysis 水法又\(n\)方二十万-- 可以先离散化,然后枚举起点,枚举向下扫 同一个数出现过或模数不相同就\(break\),注意\(k\)不够顶替还是有可能存在解不 ...