iOS开发网络篇 一一 文件上传
下面使用两种方式来实现iOS网络中的文件上传. 注意: 文件上传要发送POST请求
使用 NSURLConnection 来实现 文件上传
使用 NSURLSession 来实现 文件上传
这两种方式的区别:
NSURLConnection 需要 将上传的数据 传到请求体 中
NSURLSession 需要 将上传的数据 放到 NSURLSessionUploadTask 任务中.并且可以通过设置代理来监听文件的上传进度
文件上传步骤:
1)确定请求路径(2)根据URL创建一个可变的请求对象(3)设置请求对象,修改请求方式为POST(4)设置请求头,告诉服务器我们将要上传文件(Content-Type)(5)设置请求体(在请求体中按照既定的格式拼接要上传的文件参数和非文件参数等数据)001 拼接文件参数002 拼接非文件参数003 添加结尾标记(6)使用NSURLConnection sendAsync发送异步请求上传文件(7)解析服务器返回的数据
文件上传设置请求体的数据格式:
//请求体拼接格式//分隔符:----WebKitFormBoundaryhBDKBUWBHnAgvz9c//01.文件参数拼接格式--分隔符Content-Disposition:参数Content-Type:参数空行文件参数//02.非文件拼接参数--分隔符Content-Disposition:参数空行非文件的二进制数据//03.结尾标识--分隔符--
NSURLConnection的方式
// Created by 朝阳 on 2017/12/12.
// Copyright © 2017年 sunny. All rights reserved.
//#import "ViewController.h"
#define Kboundary @"----WebKitFormBoundaryOhB08CzI96Eux6PO"
#define KNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]@interface ViewController ()@end@implementation ViewController// 文件上传步骤(POST请求)
/*1. 设置请求头Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryOhB08CzI96Eux6PO2. 按照固定的格式拼接请求体的数据------WebKitFormBoundaryOhB08CzI96Eux6POContent-Disposition: form-data; name="file"; filename="love.jpg"Content-Type: image/jpeg------WebKitFormBoundaryOhB08CzI96Eux6POContent-Disposition: form-data; name="username"cy------WebKitFormBoundaryOhB08CzI96Eux6PO--*/// 拼接请求体的数据格式
/*拼接请求体分隔符:----WebKitFormBoundaryOhB08CzI96Eux6PO1):文件参数--分隔符Content-Disposition: form-data; name="file"; filename="love.jpg"Content-Type: image/jpeg空行文件参数2):非文件参数--分隔符Content-Disposition: form-data; name="username"空行cy3):结尾表示--分隔符--*/- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{[self upload];
}- (void)upload
{//1. 确定请求路径NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];//2. 创建可变的请求对象NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url];//3. 设置请求方法requestM.HTTPMethod = @"POST";//4. 设置请求头信息//Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryOhB08CzI96Eux6PO[requestM setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary] forHTTPHeaderField:@"Content-Type"];//5. 设置请求体数据NSMutableData *fileData = [NSMutableData data];//5.1 文件参数/*--分隔符Content-Disposition: form-data; name="file"; filename="love.jpg"Content-Type: image/jpeg空行文件参数*/[fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];// 拼接换行[fileData appendData:KNewLine];//name:file 服务器规定的参数//filename:Snip20160225_341.png 文件保存到服务器上面的名称//Content-Type:文件的类型[fileData appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"love.jpg\"" dataUsingEncoding:NSUTF8StringEncoding]];[fileData appendData:KNewLine];[fileData appendData:[@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding]];[fileData appendData:KNewLine];[fileData appendData:KNewLine];UIImage *image = [UIImage imageNamed:@"love"];// UIImage --> NSDataNSData *imageData = UIImagePNGRepresentation(image);[fileData appendData:imageData];[fileData appendData:KNewLine];//5.2 非文件参数/*--分隔符Content-Disposition: form-data; name="username"空行cy*/[fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];[fileData appendData:KNewLine];[fileData appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];[fileData appendData:KNewLine];[fileData appendData:KNewLine];[fileData appendData:[@"cy" dataUsingEncoding:NSUTF8StringEncoding]];[fileData appendData:KNewLine];//5.3 结尾标识/*--分隔符--*/[fileData appendData:[[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];//6. 设置请求体requestM.HTTPBody = fileData;//7. 发送请求[NSURLConnection sendAsynchronousRequest:requestM queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {//8.解析数据NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);}];
}@end
NSURLSession的方式
// Created by 朝阳 on 2017/12/20.
// Copyright © 2017年 sunny. All rights reserved.
//#import "ViewController.h"
#define Kboundary @"----WebKitFormBoundaryOhB08CzI96Eux6PO"
#define KNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]
@interface ViewController ()<NSURLSessionDataDelegate>@property (nonatomic,strong) NSURLSession *session;@end@implementation ViewController#pragma -mark lazy loading
- (NSURLSession *)session
{// 统一设置所有的 会话对象创建的任务(upload,upload2)的 配置if (!_session) {// 设置会话对象的配置NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];// 设置配置的一些内容//是否运行蜂窝访问config.allowsCellularAccess = YES;// 网络超时config.timeoutIntervalForRequest = 15;//创建会话对象_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];}return _session;
}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{[self upload];
}- (void)upload
{//1. 创建请求路径NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/upload"];//2. 创建可变请求对象NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url];//2.1 设置请求方法requestM.HTTPMethod = @"POST";//2.2 设置请求头信息[requestM setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary] forHTTPHeaderField:@"Content-Type"];//4. 创建NSURLSessionUploadTask任务/*param1: 请求对象param2: 请求体数据*/NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithRequest:requestM fromData:[self getBobyData] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {// 解析数据NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);}];//5. 执行task[uploadTask resume];
}- (void)upload2
{//1. 创建请求路径NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/upload"];//2. 创建可变请求对象NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url];//2.1 设置请求方法requestM.HTTPMethod = @"POST";//2.2 设置请求头信息[requestM setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary] forHTTPHeaderField:@"Content-Type"];//4. 创建NSURLSessionUploadTask任务/*param1: 请求对象param2: 请求体数据*/NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithRequest:requestM fromData:[self getBobyData] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {// 解析数据NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);}];//5. 执行task[uploadTask resume];
}- (NSData *)getBobyData
{//5. 设置请求体数据NSMutableData *fileData = [NSMutableData data];//5.1 文件参数/*--分隔符Content-Disposition: form-data; name="file"; filename="love.jpg"Content-Type: image/jpeg空行文件参数*/[fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];// 拼接换行[fileData appendData:KNewLine];//name:file 服务器规定的参数//filename:Snip20160225_341.png 文件保存到服务器上面的名称//Content-Type:文件的类型[fileData appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"cy.jpg\"" dataUsingEncoding:NSUTF8StringEncoding]];[fileData appendData:KNewLine];[fileData appendData:[@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding]];[fileData appendData:KNewLine];[fileData appendData:KNewLine];UIImage *image = [UIImage imageNamed:@"love4"];// UIImage --> NSDataNSData *imageData = UIImagePNGRepresentation(image);[fileData appendData:imageData];[fileData appendData:KNewLine];//5.2 非文件参数/*--分隔符Content-Disposition: form-data; name="username"空行cy*/[fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];[fileData appendData:KNewLine];[fileData appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];[fileData appendData:KNewLine];[fileData appendData:KNewLine];[fileData appendData:[@"cy" dataUsingEncoding:NSUTF8StringEncoding]];[fileData appendData:KNewLine];//5.3 结尾标识/*--分隔符--*/[fileData appendData:[[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];return fileData;
}#pragma -mark NSURLSessionDataDelegate/** @param bytesSent 本次发送的数据* @param totalBytesSent 上传完成的数据大小* @param totalBytesExpectedToSend 文件的总大小*/
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
{NSLog(@"%f", 1.0 * totalBytesSent / totalBytesExpectedToSend);
}@end
iOS开发网络篇 一一 文件上传相关推荐
- ios开发之使用多文件上传的简单封装最原始的
ios开发之使用多文件上传的简单封装最原始的 // // ViewController.m // 18-上传多个文件 // // Created by 鲁军 on 2021/2/13. //#impo ...
- IOS开发基础之单文件上传基础最原始的方式
IOS开发基础之单文件上传基础最原始的方式 info.plist 加入一行代码 <key>NSAppTransportSecurity</key><dict>< ...
- iOS开发网络篇 一一 AFN的基本使用
一.AFN发送网络请求 知识点: 1. 使用AFN来发送网络请求: 需要创建会话管理者: AFHTTPSessionManager 对象 [AFHTTPSessionManager manager] ...
- iOS开发网络篇 一一 SDWebImage框架的基本使用
SDWebImage相关资料链接: http://www.jianshu.com/p/be9a0a088feb SDWebImage的项目文件. SDWebImage框架中的一些内部细节: // 当发 ...
- iOS开发网络篇 一一 请求路径(URL)中文转码问题
当发送网络请求: 确定请求路径URL 时, 观察url中是否包含中文, 如果包含中文 需要将url中的中文进行转码操作. 注意: 上面这种情况 只针对于发送GET请求,因为GET请求的URL 包含用户 ...
- 02.iOS开发网络篇—HTTP协议
iOS开发网络篇-HTTP协议 说明:apache tomcat服务器必须占用8080端口 一.URL 1.基本介绍 URL的全称是Uniform Resource Locator(统一资源定位符) ...
- iOS开发网络篇—使用ASI框架进行文件下载
iOS开发网络篇-使用ASI框架进行文件下载 说明:本文介绍iOS网络编程中经常用到的框架ASI,如何使用该框架进行文件的下载. 一.简单介绍 代码示例: 1 #import "YYView ...
- iOS开发网络篇—搭建本地服务器
iOS开发网络篇-搭建本地服务器 一.简单说明 说明:提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提示:提前准备好的软件 apache- ...
- iOS开发网络篇—多线程断点下载
iOS开发网络篇-多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...
最新文章
- 大疆车载招聘|SLAM、地图定位、感知算法、机器学习算法工程师
- 【NOIP模拟】T1 发电机(递推逆元+期望)
- 基于netty实现mq
- Windows_Reverse2逆向寒假生涯(25/100)
- 个人发卡网搭建源码_免费建设一个个人网站到底能不能实现
- 最简单的基于FFMPEG的Helloworld程序
- 小技巧:浏览器里显示成星号的密码,忘记了该怎么办?
- Halcon学习笔记:select_points_object_model_3d(3D对象模型阀值分割)
- java中发红包案例之红包界面不出来的解决方案
- Oracle Hint
- js获取当前月的第一天和最后一天
- Mybatis框架相关知识讲解
- java 仿百度文库源码_Java模拟实现百度文档在线浏览
- SaaS、PaaS、IaaS云服务模式和商业云平台设计与建设方案
- 吉他指弹入门——特殊调弦
- python发邮件图片太长显示不出来_小白入门,用python 发送定时邮件,将Dataframe转为邮件正文,链接显示为图片...
- webuploader怎样上传文件夹
- Mybatis-Plus用纯注解完成一对多多对多查询
- 计算机工程与科学北京,高强铝合金加速腐蚀方法的研究-计算机工程与科学-北京航空航天大学.PDF...
- python24小时12小时转换_Python上24小时时间转换为12小时制(ProblemSetQuestion)