[iOS]网络之NSURLSession的文件上传
来源:互联网 发布:网络百家家乐是真的吗 编辑:程序博客网 时间:2024/06/06 03:23
有些APP需要实现保存图片、视频、文档等信息。APP的开发者希望用户能够在任意设备上,获取用户保存的信息,这就需要服务器的支持了,APP如何上传数据,这就是这篇所要解决的问题。
- NSURLSessionUploadTask 介绍
- 使用NSURLSessionUploadTask进行上传
- 总结
NSURLSessionUploadTask 介绍
NSURLSessionUploadTask支持三种任务类型中的上传任务类型,它支持三种上传类型:NSData对象、文件和流
· 如果你的数据全部在内存中,使用NSData对象好一点。
· 如果你的数据作为文件上传,这种方式不太占内存。
· 如果你需要边生产数据边上传,请使用数据流。
不管使用何种方式上传数据,获取数据上传信息(进度等),需实现代理方法:
/** * @param (int64_t)bytesSent 每秒上传多少数据 * @param (int64_t)totalBytesSent 已经上传了多少数据 * (int64_t)totalBytesExpectedToSend 需要上传数据的总共的大小 */- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend;
使用NSURLSessionUploadTask进行上传
使用NSURLSessionUploadTask进行文件上传,有三种方式:
- NSData对象上传
-(NSURLSessionUploadTask )uploadTaskWithRequest:(NSURLRequest )request fromData:(NSData *)bodyData;- 文件上传
-(NSURLSessionUploadTask )uploadTaskWithRequest:(NSURLRequest )request fromFile:(NSURL *)fileURL;- 流上传
-(NSURLSessionUploadTask )uploadTaskWithStreamedRequest:(NSURLRequest )request;
/******************************************************************************/ // 从磁盘中加载文件到内存中,作为NSData数据进行上传,这种方式占用内存大。 // 获取文件的路径 NSURL *textFileURL = [NSURL fileURLWithPath:@"/path/UsingNSURLSession.htm"]; //加载到内存中,作为NSData对象 NSData *data = [NSData dataWithContentsOfURL:textFileURL]; // 设置上传的服务器地址,设置Request对象。 NSURL *url = [NSURL URLWithString:@"https://www.example.com/"]; NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:url]; mutableRequest.HTTPMethod = @"POST"; [mutableRequest setValue:[NSString stringWithFormat:@"%lld", data.length] forHTTPHeaderField:@"Content-Length"]; [mutableRequest setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"]; // 创建会话类型 NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:[[UploadTaskDelegate alloc] init] delegateQueue:[NSOperationQueue mainQueue]]; // 利用NSData对象创建上传任务 NSURLSessionUploadTask *uploadTask = [[self defaultSession] uploadTaskWithRequest:mutableRequest fromData:data]; [uploadTask resume];/******************************************************************************/ //注意,作为NSData上传和作为文件上传是有区别的区别,作为文件上传,不需要我们加载到内存中。上面的NSData上传,是需要手动加载到内存中的。所以这种方式不怎么占内存。 NSURL *textFileURL = [NSURL fileURLWithPath:@"/Users/ag/Desktop/UsingNSURLSession.htm"]; NSURL *url = [NSURL URLWithString:@"https://www.example.com/"]; NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:url]; mutableRequest.HTTPMethod = @"POST"; // 利用文件路径创建上传任务 NSURLSessionUploadTask *uploadTask = [[self defaultSession] uploadTaskWithRequest:mutableRequest fromFile:textFileURL]; [uploadTask resume];/******************************************************************************/NSURL *textFileURL = [NSURL fileURLWithPath:@"/path/to/file.txt"];NSURL *url = [NSURL URLWithString:@"https://www.example.com/"];NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:url];mutableRequest.HTTPMethod = @"POST";mutableRequest.HTTPBodyStream = [NSInputStream inputStreamWithFileAtPath:textFileURL.path];[mutableRequest setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];[mutableRequest setValue:[NSString stringWithFormat:@"%lld", data.length] forHTTPHeaderField:@"Content-Length"];NSURLSessionUploadTask *uploadTask = [defaultSession uploadTaskWithStreamedRequest:mutableRequest];[uploadTask resume];/******************************************************************************/ //待上传的路径 NSURL *textFileURL = [NSURL fileURLWithPath:@"/Users/ag/Desktop/UsingNSURLSession.htm"]; //配置请求体 //设置服务器的URL NSURL *url = [NSURL URLWithString:@"https://www.example.com/"]; NSMutableURLRequest *mutableRequest = [NSMutableURLRequest requestWithURL:url]; //设置请求方法 mutableRequest.HTTPMethod = @"POST"; //将上传数据作为流进行上传,注意NSInputStream *HTTPBodyStream和NSData *HTTPBody是互斥的,不要同时设置。 mutableRequest.HTTPBodyStream = [NSInputStream inputStreamWithFileAtPath:textFileURL.path]; [mutableRequest setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"]; //需要告知内容有多大。 [mutableRequest setValue:[NSString stringWithFormat:@"%lld", [NSData dataWithContentsOfURL:textFileURL].length] forHTTPHeaderField:@"Content-Length"]; //流创建上传任务 NSURLSessionUploadTask *uploadTask = [[self defaultSession] uploadTaskWithStreamedRequest:mutableRequest]; [uploadTask resume];/******************************************************************************///代理方法/** * 获取上传的进度信息,可以帮组我们合理的实现进度条 * @param (int64_t)bytesSent 每秒上传多少数据 * @param (int64_t)totalBytesSent 已经上传了多少数据 * (int64_t)totalBytesExpectedToSend 需要上传数据的总共的大小 */- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend{ NSLog(@"Session %@ download task %@ wrote an additional %lld bytes (total %lld bytes) out of an expected %lld bytes.\n", session, task, bytesSent, totalBytesSent, totalBytesExpectedToSend);}
我们很清楚的看到111KB的文件,上传的信息。
总结
上传任务可以分三种方式上传,如果你的文件小,不怎么占内存,可以使用NSData创建上传任务,否则请使用文件创建上传任务。如果想边生产数据边上传的话,请使用流。
参考资料
官方文档:URL Session Programming Guide
阅读全文
0 0
- [iOS]网络之NSURLSession的文件上传
- [iOS]网络之NSURLSession的文件下载
- IOS学习 网络 NSURLSession和POST文件上传
- iOS NSURLSession 实现网络请求-文件下载-上传-后台下载
- [iOS]网络之NSURLSession的数据传输
- iOS之网络—— NSURLSessionDataTask文件离线断点下载、NSURLSession文件上传、AFN基本使用、Cocoapods安装
- 网络:NSURLSession 上传文件和代理的选择
- iOS -- NSURLSession网络请求,上传,下载
- iOS开发之网络编程--1、NSURLSession的基本使用
- iOS开发之网络编程--1、NSURLSession的基本使用
- iOS网络开发之NSURLSession学习<1>
- iOS网络开发之NSURLSession学习<2>
- iOS网络开发之NSURLSession学习<3>
- iOS网络开发之NSURLSession学习<4>
- IOS网络请求之NSURLSession使用
- IOS网络请求之NSURLSession使用
- IOS网络请求之NSURLSession使用
- iOS之网络请求NSURLSession剖析
- JAVA学习笔记(6)--String的常用方法
- 整合JavaWeb面试过程中相关问题
- iOS 中APP被拒以及解决办法总结<待更新>
- 如何阻止button默认的刷新页面操作
- C++面试考前一天抱佛脚(哈哈哈哈啊哈哈哈)
- [iOS]网络之NSURLSession的文件上传
- 项目改造-maven(上)
- nodejs响应信息乱码
- 集合框架专题1-集合框架概述
- 三神器-迭代器、生成器和装饰器
- C#学习笔记8-整型的三种强制转换int、int.Parse()和Convert.ToInt32()
- Python如何生成随机码?
- 07翻转整数
- Android 内核模块存放位置