文件上传的步骤:

(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的文件上传的更多相关文章

  1. ios开发网络学习十二:NSURLSession实现文件上传

    #import "ViewController.h" // ----WebKitFormBoundaryvMI3CAV0sGUtL8tr #define Kboundary @&q ...

  2. NSURLSession实现文件上传

    7.1 涉及知识点(1)实现文件上传的方法 /* 第一个参数:请求对象 第二个参数:请求体(要上传的文件数据) block回调: NSData:响应体 NSURLResponse:响应头 NSErro ...

  3. iOS-网络编程(二)文件上传和断点离线下载

    一. iOS中发送HTTP请求的方案 在iOS中,我们常用发送HTTP请求的方案有苹果原生(自带)NSURLConnection:用法简单,最古老最经典最直接的一种方案 (iOS 9.0弃用)NSUR ...

  4. 【iOS】文件上传小记

    iOS由该系统提供API可以实现可以实现文件的上传和下载,有两种方法来. NSURLConnection与NSURLSession. 当中NSURLConnection是使用非常久的的一种方式.NSU ...

  5. 在OS X 10.9配置WebDAV服务器联合NSURLSessionUploadTask实现文件上传

    iOS7推出的NSURLSession简化了NSURLConnection的文件上传和下载的工作,本文记录如何配置WebDAV服务以支持PUT方式的文件上传. 一. 配置WebDAV服务器 1. 修改 ...

  6. iOS开发系列-文件上传

    概述 Http协议对文件上传协议要求的 1. 必须设置请求头Content-Type为multipart/form-data.在iOS中后面需要跟上分隔符比如:boundary=----WebKitF ...

  7. jquery.uploadify文件上传组件

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  8. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  9. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

随机推荐

  1. Cesium专栏-Billboard加载Gif图片

    Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...

  2. zuul网关

    Zuul路由网关简介及基本使用 简介 Zuul API路由网关服务简介 请看上图,这里的API 路由网关服务 由Zuul实现,主要就是对外提供服务接口的时候,起到了请求的路由和过滤作用,也因此能够隐藏 ...

  3. 利用keras自带影评数据集进行评价正面与否的二分类训练

    from keras.datasets import imdb from keras import layers from keras import models from keras import ...

  4. SpringCloud 脚手架

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...

  5. Shell命令的执行优先级

    Shell内置命令.外部命令.别名.函数.保留关键字的优先级 在Shell中,有5种可调用的东西:别名(alias).函数(function).shell保留关键字.shell内置命令.外部命令. 如 ...

  6. Java生鲜电商平台-电商会员体系搭建

    Java生鲜电商平台-电商会员体系搭建 说明:因为之前一直从事的是B端的生鲜电商方面的产品,对会员体系方面有深刻的理解,今天来聊一聊会员体系的搭建. 明确会员体系的目的 首先我们需要明确的知道,搭建电 ...

  7. echarts 双Y轴图表

    直接代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  8. 提速企业应用开发,Ntaub 3极速开发平台发布

    企业管理系统搞了这么多年,还是以表单.数据增删改这些功能为主.唯一的变化就是“变化”,企业的业务模式和流程越来越多样化,开发需求变更越来越频繁,开发周期却要求越来越短. 无代码.低代码开发平台开始流行 ...

  9. 使用SQL Server内存优化表 In-Memory OLTP

    如果你的系统有高并发的要求,可以尝试使用SQL Server内存优化表来提升你的系统性能.你甚至可以把它当作Redis来使用. 要使用内存优化表,首先要在现在数据库中添加一个支持内存优化的文件组. M ...

  10. centos7.6 安装Tomcat-8.5.39

    #关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld setenforce sed -i '/SELINUX=/ s/ ...