文件上传的步骤:

(1)确定上传路径

(2)创建“可变”请求对象

(3)修改请求方法为POST

    --设置请求头信息,告诉服务器这是一个文件上传请求

    --按照固定的格式拼接数据

(4)设置请求体信息(文件参数)

(5)创建会话对象

(6)根据会话对象来创建uploadTask

(7)执行task发送请求上传文件

代码示例如下:

需要注意的是:拼接的数据是必须按照格式拼接,否则会报错。

  1. #import "ViewController.h"
  2.  
  3. #define kBoundary @"----WebKitFormBoundaryXGAyMbuVkeaFc916"
  4. #define kNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]
  5. @interface ViewController ()
  6.  
  7. @end
  8.  
  9. @implementation ViewController
  10.  
  11. - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
  12. // (1)确定上传路径
  13. NSURL *url = [NSURL URLWithString:@"http://mbs.test.internet.zhiwangyilian.com/api/files/upload"];
  14. //(2)创建“可变”请求对象
  15. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  16. //(3)修改请求方法为POST
  17. request.HTTPMethod = @"POST";
  18. // --设置请求头信息,告诉服务器这是一个文件上传请求
  19. //Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXGAyMbuVkeaFc916
  20. [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", kBoundary] forHTTPHeaderField:@"Content-Type"];
  21. //--按照固定的格式拼接数据 ----这个放在bodyData中拼接
  22. //(4)设置请求体信息(文件参数) ----这个放在bodyData中拼接
  23. //(5)创建会话对象
  24. NSURLSession *session = [NSURLSession sharedSession];
  25. //(6)根据会话对象来创建uploadTask
  26. /**
  27. 第一个参数:请求对象
  28. 第二个参数:本应该放在请求体中的信息,如果放在请求头中,会被忽略
  29. */
  30. NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromData:[self bodyData] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  31. NSLog(@"---%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
  32. }];
  33. //(7)执行task发送请求上传文件
  34. [uploadTask resume];
  35. }
  36.  
  37. - (NSData *)bodyData {
  38. NSMutableData *data = [NSMutableData data];
  39. //01 拼接文件参数
  40. /**
  41. --分隔符
  42. Content-Disposition: form-data; name="file"; filename="22e93acbcced42dbb319a2fc0ecdcec9.jpg"
  43. Content-Type: image/jpeg
  44. 空行
  45. 文件数据
  46. --分隔符--
  47. */
  48. [data appendData:[[NSString stringWithFormat:@"--%@",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
  49. [data appendData:kNewLine];
  50. //name=file,其中file是不能随便写的,服务器要求写什么就写什么
  51. [data appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"22e93acbcced42dbb319a2fc0ecdcec9.jpg\"" dataUsingEncoding:NSUTF8StringEncoding]];
  52. [data appendData:kNewLine];
  53. //要上传文件的而进士数据类型,组成:大类型/小类型
  54. [data appendData:[@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding]];
  55. [data appendData:kNewLine];
  56. [data appendData:kNewLine];
  57. NSData *imageData = [NSData dataWithContentsOfFile:@"/Users/gao/Desktop/图片/课程图片/61149b0491243c749fc871e67550a7f6.png"];
  58. [data appendData:imageData];
  59. [data appendData:kNewLine];
  60.  
  61. //02 拼接非文件参数--如果有非文件的数据,就加上这个拼接的格式
  62. /**
  63. --分隔符
  64. Content-Dispositon: form-data; name="useruame"
  65. 空行
  66. abcdf(输入的内容)
  67. */
  68. [data appendData:[[NSString stringWithFormat:@"--%@",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
  69. [data appendData:kNewLine];
  70. [data appendData:[@"Content-Dispositon: form-data; name=\"useruame\"" dataUsingEncoding:NSUTF8StringEncoding]];
  71. [data appendData:kNewLine];
  72. [data appendData:kNewLine];
  73. [data appendData:[@"abscdd" dataUsingEncoding:NSUTF8StringEncoding]];
  74. [data appendData:kNewLine];
  75.  
  76. //03 结尾表示
  77. [data appendData:[[NSString stringWithFormat:@"--%@--",kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
  78.  
  79. return data;
  80. }
  81.  
  82. @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. inux 资源监控分析-pidstat

    pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu.内存.线程.设备IO等系统资源的占用情况.pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat ...

  2. 一个经典的代码--Convert char to int in C and C++

    前记 写程序,就像建房子,对于高超的建筑师来说,是要有一些好的素材的.作为一个程序员,见了好用的素材存起来,以备后面需要,也是一门很好的修养. 实例代码 一个char 转int的经典代码,这里分享一下 ...

  3. IT兄弟连 HTML5教程 W3C盒子模型

    日常生活中所见的盒子也就是能装东西的一种箱子,如果家里的东西很多,那么就需要按类别装到不同的箱子中.网页中的内容表现也是一样的,如果页面内容比较多,又想让页面更整洁.更美观.有很好的用户体验,则也需要 ...

  4. 带你自行搭建虚拟机和Redis集群环境,值得收藏!

    前言: 我们看到分析 Redis 使用或原理的文章不少,但是完整搭建一套独立的 redis 集群环境的介绍,并不是很多或者说还不够详细. 那么,本文会手把手带着大家搭建一套 Redis 集群环境,Re ...

  5. Rancher2.x流水线自动化部署

    1.概述 由于一些项目使用了rancher进行部署发布,所以使用Rancher的流水线自动部署功能实现CICD,从gitlab.harbor安装,到流水线配置和中间的一些问题一一进行详细介绍解答. 2 ...

  6. 高强度学习训练第六天总结:Redis主从关系总结

    Redis主从复制机制 1.读写分离的好处 性能优化:主服务器专注于写操作,可以更适合写入数据的模式工作:同样,从服务器专注于读操作,可以用更适合读取数据的模式工作. 强化数据安全,避免单点故障:由于 ...

  7. iOS中UICollectionView添加头视图

    参考链接:https://www.jianshu.com/p/ef57199bf34a 找了一堆的博客,写的都少了很重要的一步. //引入头部视图 -(UICollectionReusableView ...

  8. 有抱负的 DevOps 和 SRE 工程师必读好书清单 | 文末有福利!

    原文地址:https://medium.com/faun/10-great-books-for-aspiring-devops-sre-engineers-76536c7c4909 原文作者:Ayme ...

  9. TCP/IP网络协议初识

    目录 一.什么是协议? 二.什么是TCP/IP协议? 三.TCP/IP为什么这么多协议? 四.TCP/IP协议为什么分层? 五.TCP/IP协议如何入门? 六.TCP/IP 的分层: 七.各协议层打包 ...

  10. [PHP] socket客户端时的超时问题

    连接socket分为连接超时和读取超时 $sock=stream_socket_client("www.google.com:80", $errno,$errstr,2);    ...