iOS开发系列-文件上传
概述
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开发系列-文件上传的更多相关文章
- Java开发系列-文件上传
		
概述 Java开发中文件上传的方式有很多,常见的有servlet3.0.common-fileUpload.框架.不管哪种方式,对于文件上传的本质是不变的. 文件上传的准备 文件上传需要客户端跟服务都 ...
 - 【转】 iOS开发之打包上传到App Store——(一)各种证书的理解
		
OK,有日子没写iOS开发的相关文章啦,主要是最近的精力都没在这上面,不过既然产品已经快要出来了,就有必要了解一下各种证书啥的(众所周知iOS的一堆证书可是很让人头大呀),最近确实被这个搞得头大,然后 ...
 - SpringBoot | 第十七章:web应用开发之文件上传
		
前言 上一章节,我们讲解了利用模版引擎实现前端页面渲染,从而实现动态网页的功能,同时也提出了兼容jsp项目的解决方案.既然开始讲解web开发了,我们就接着继续往web这个方向继续吧.通常,我们在做we ...
 - SpringBoot --web 应用开发之文件上传
		
原文出处: oKong 前言 上一章节,我们讲解了利用模版引擎实现前端页面渲染,从而实现动态网页的功能,同时也提出了兼容jsp项目的解决方案.既然开始讲解web开发了,我们就接着继续往web这个方向继 ...
 - 04springMVC结构,mvc模式,spring-mvc流程,spring-mvc的第一个例子,三种handlerMapping,几种控制器,springmvc基于注解的开发,文件上传,拦截器,s
		
 1. Spring-mvc介绍 1.1市面上流行的框架 Struts2(比较多) Springmvc(比较多而且属于上升的趋势) Struts1(即将被淘汰) 其他 1.2 spring-mv ...
 - Java开发之文件上传
		
文件上传有SmartUpload.Apache的Commons fileupload.我们今天介绍Commons fileupload的用法. 1.commons-fileupload-1.3.1.j ...
 - Web 开发中 文件上传 是出现的:java.io.FileNotFoundException: (文件名、目录名或卷标语法不正确。)
		
<span style="font-family: Arial, Helvetica, sans-serif; "> </span> <span st ...
 - Egg.js学习与实战系列 · 文件上传配置
		
在使用Egg.js搭建文件上传服务时,遇到了几个一般新手都会遇到的坑. 经查阅官方文档,Egg框架中默认使用egg-multipart插件进行文件上传,所以上传文件前需要做相关的配置. 上传文件提示: ...
 - Baidu WebFE(FEX)团队开发 的 文件上传插件 WebUploader
		
1.webUploader官网下载地址:http://fex.baidu.com/webuploader/ 直接下载代码,运行examples目录文件即可 2.webUploader上传demo:ht ...
 
随机推荐
- thinkphp 标签扩展
			
标签库加载直线电机参数 模板中加载标签库,预加载自定义标签库,扩展内置标签库的加载 请参考:http://document.thinkphp.cn/manual_3_2.html#taglib 自定义 ...
 - thinlphp配置加载
			
在ThinkPHP中,一般来说应用的配置文件是自动加载的,加载的顺序是: 惯例配置->应用配置->模式配置->调试配置->状态配置->模块配置->扩展配置-> ...
 - Struts功能详解——ActionForm
			
ActionForm ActionForm用于封装用户的请求参数,而请求参数是通过JSP页面的表单域传递过来的.因此应保证ActionForm的参数,与表单域的名字相同. ActionForm ...
 - NX二次开发-UFUN链表UF_MODL_create_list等用法
			
NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_curve.h> #include < ...
 - NX二次开发-删除功能区工具栏UF_UI_remove_ribbon
			
NX9+VS2012 1.打开D:\Program Files\Siemens\NX 9.0\UGII\menus\ug_main.men 找到装配和PMI,在中间加上一段 TOGGLE_BUTTON ...
 - [luogu 4389] 付公主的背包
			
题意:求一个较大的多重背包对于每个i的方案数,答案对998244353取模. 思路: 生成函数: 对于一个\(V\) 设: \(f(x) = \sum_{i=0}^{oo} x ^ {V * i} = ...
 - .Net Core 部署之一 《CentOS 从GitHub/Gitee 等源代码网站部署Web网站》
			
先看下楼主从某阿打折购买的渣渣服务器 lsb_release -a 一.安装dotnet-SDK 注册微软的服务 sudo rpm -Uvh https://packages.microsoft.co ...
 - scanf 与getchar区别
			
#include<stdio.h> void main() { int c; c=getchar(); //scanf("%c",&c); if(c!=' ...
 - 《DSP  using MATLAB》Problem 8.43
			
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
 - 22-MySQL-Ubuntu-备份与恢复
			
案例: 将数据库jing_dong_1的数据库备份,然后恢复到数据库jing_dong_2; 步骤如下: 1.备份 注意: mysqldump 不是 mysql; 尖括号的方向; python.sql ...