NSURLSession的文件上传
文件上传的步骤:
(1)确定上传路径
(2)创建“可变”请求对象
(3)修改请求方法为POST
--设置请求头信息,告诉服务器这是一个文件上传请求
--按照固定的格式拼接数据
(4)设置请求体信息(文件参数)
(5)创建会话对象
(6)根据会话对象来创建uploadTask
(7)执行task发送请求上传文件
代码示例如下:
需要注意的是:拼接的数据是必须按照格式拼接,否则会报错。
#import "ViewController.h" #define kBoundary @"----WebKitFormBoundaryXGAyMbuVkeaFc916"
#define kNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]
@interface ViewController () @end @implementation ViewController - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// (1)确定上传路径
NSURL *url = [NSURL URLWithString:@"http://mbs.test.internet.zhiwangyilian.com/api/files/upload"];
//(2)创建“可变”请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//(3)修改请求方法为POST
request.HTTPMethod = @"POST";
// --设置请求头信息,告诉服务器这是一个文件上传请求
//Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXGAyMbuVkeaFc916
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", kBoundary] forHTTPHeaderField:@"Content-Type"];
//--按照固定的格式拼接数据 ----这个放在bodyData中拼接
//(4)设置请求体信息(文件参数) ----这个放在bodyData中拼接
//(5)创建会话对象
NSURLSession *session = [NSURLSession sharedSession];
//(6)根据会话对象来创建uploadTask
/**
第一个参数:请求对象
第二个参数:本应该放在请求体中的信息,如果放在请求头中,会被忽略
*/
NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:[self bodyData] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"---%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
//(7)执行task发送请求上传文件
[uploadTask resume];
} - (NSData *)bodyData {
NSMutableData *data = [NSMutableData data];
//01 拼接文件参数
/**
--分隔符
Content-Disposition: form-data; name="file"; filename="22e93acbcced42dbb319a2fc0ecdcec9.jpg"
Content-Type: image/jpeg
空行
文件数据
--分隔符--
*/
[data appendData:[[NSString stringWithFormat:@"--%@",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:kNewLine];
//name=file,其中file是不能随便写的,服务器要求写什么就写什么
[data appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"22e93acbcced42dbb319a2fc0ecdcec9.jpg\"" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:kNewLine];
//要上传文件的而进士数据类型,组成:大类型/小类型
[data appendData:[@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:kNewLine];
[data appendData:kNewLine];
NSData *imageData = [NSData dataWithContentsOfFile:@"/Users/gao/Desktop/图片/课程图片/61149b0491243c749fc871e67550a7f6.png"];
[data appendData:imageData];
[data appendData:kNewLine]; //02 拼接非文件参数--如果有非文件的数据,就加上这个拼接的格式
/**
--分隔符
Content-Dispositon: form-data; name="useruame"
空行
abcdf(输入的内容)
*/
[data appendData:[[NSString stringWithFormat:@"--%@",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:kNewLine];
[data appendData:[@"Content-Dispositon: form-data; name=\"useruame\"" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:kNewLine];
[data appendData:kNewLine];
[data appendData:[@"abscdd" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:kNewLine]; //03 结尾表示
[data appendData:[[NSString stringWithFormat:@"--%@--",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]]; return data;
} @end
NSURLSession的文件上传的更多相关文章
- ios开发网络学习十二:NSURLSession实现文件上传
#import "ViewController.h" // ----WebKitFormBoundaryvMI3CAV0sGUtL8tr #define Kboundary @&q ...
- NSURLSession实现文件上传
7.1 涉及知识点(1)实现文件上传的方法 /* 第一个参数:请求对象 第二个参数:请求体(要上传的文件数据) block回调: NSData:响应体 NSURLResponse:响应头 NSErro ...
- iOS-网络编程(二)文件上传和断点离线下载
一. iOS中发送HTTP请求的方案 在iOS中,我们常用发送HTTP请求的方案有苹果原生(自带)NSURLConnection:用法简单,最古老最经典最直接的一种方案 (iOS 9.0弃用)NSUR ...
- 【iOS】文件上传小记
iOS由该系统提供API可以实现可以实现文件的上传和下载,有两种方法来. NSURLConnection与NSURLSession. 当中NSURLConnection是使用非常久的的一种方式.NSU ...
- 在OS X 10.9配置WebDAV服务器联合NSURLSessionUploadTask实现文件上传
iOS7推出的NSURLSession简化了NSURLConnection的文件上传和下载的工作,本文记录如何配置WebDAV服务以支持PUT方式的文件上传. 一. 配置WebDAV服务器 1. 修改 ...
- iOS开发系列-文件上传
概述 Http协议对文件上传协议要求的 1. 必须设置请求头Content-Type为multipart/form-data.在iOS中后面需要跟上分隔符比如:boundary=----WebKitF ...
- jquery.uploadify文件上传组件
1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...
- 11、Struts2 的文件上传和下载
文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...
- Java FtpClient 实现文件上传服务
一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...
随机推荐
- idea自用快捷键(非常实用)
最近看了下idea的快捷键,不禁感慨idea真是太强大了,这里记录一下我常用的快捷键 Ctrl+F:在当前文件中查找 Ctrl+R:替换字符串 Alt + shift + 鼠标点击 多处同时编辑 ...
- Spring Boot Starters到底怎么回事?
前言 上周看了一篇.你一直在用的Spring Boot Starters究竟是怎么回事(https://www.cnblogs.com/fengzheng/p/10947585.html) 感觉终 ...
- WPF 3D 球面导览
基于WPF的3D Sphere实现模式,升级实现了该3D导览Demo.先pose一张demo效果图 所有顶点的坐标来源于足球的顶点.足球整个球面完全由正五边形和正六边形拼成,每条拼缝的长度一致,故知道 ...
- 熔断器Hystrix及服务监控Dashboard
服务雪崩效应 当一个请求依赖多个服务的时候: 正常情况下的访问 : 但是,当请求的服务中出现无法访问.异常.超时等问题时(图中的I),那么用户的请求将会被阻塞. 如果多个用户的请求中,都存在无法访问的 ...
- JS---DOM---为元素绑定事件的引入,为元素绑定多个代码,兼容代码
1. 为元素绑定事件的引入: 用src直接绑定多个,只实现最后一个(programmer2.js) <input type="button" value="按钮&q ...
- JS基础语法---基本包装类型
基本包装类型 普通变量不能直接调用属性或者方法 对象可以直接调用属性和方法 基本包装类型: 本身是基本类型, 但是在执行代码的过程中, 如果这种类型的变量调用了属性或者是方法, 那么这种类型就 ...
- English: Class GXX
######################################## GGGGG GG GG GG GG GGGG GG GGG GGGGGG author:enomothem date: ...
- iOS开发中全量日志的获取
我们在app中对崩溃.卡顿.内存问题进行监控.一旦监控到问题,我们就需要记录下来,但是,很多问题的定位仅靠问题发生的那一刹那记录的信息是不够的,我们需要记录app的全量日志来获取更多的信息. 一,使用 ...
- 浅谈——MySQL存储引擎
博文大纲: 一.MyISAM存储引擎: 二.InnoDB存储引擎: 三.Memory存储引擎特点: 四.如何选择合适的存储引擎? 前言 数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使 ...
- Object::connect: No such slot xxx 解决方法
在所有代码和槽函数全部写好之后,进行编译时竟然报 No such slot xxxx,奇怪 Starting E:\01_project\03_C++\key\debug\key.exe... Obj ...