IOS 网络开发NSURLSession(四)UploadTask(上传数据+图片)

原创blog,转载请注明出处

blog.csdn.net/hello_hwc



前言:

UploadTask继承自DataTask。不难理解,因为UploadTask只不过在Http请求的时候,把数据放到Http Body中。所以,用UploadTask来做的事情,通常直接用DataTask也可以实现。不过,能使用封装好的API会省去很多事情,何乐而不为呢?

Demo下载链接

http://download.csdn.net/detail/hello_hwc/8557791

Demo里包括了三种Task的使用,我想对想要学习NSURLSession的初学者还是有点帮助的。


Demo效果

上传数据

使用一个工具网站,想要学习RestAPI的同学可以使用这个网站的API做一些练习。

http://jsonplaceholder.typicode.com/

上传图片,图片可以拍照,也可以从相册里选取,上传的返回data是一个html网页,用webview显示。

这里的上传服务器也是选择一个共工具网站

http://www.freeimagehosting.net/upl.php


一 NSURLSessionUploadTask概述

1.1NSMutableURLRequest

上传数据的时候,一般要使用REST API里的PUT或者POST方法。所以,要通过这个类来设置一些HTTP配置信息。常见的包括

timeoutInterval //timeout的时间间隔
HTTPMethod //HTTP方法

//设置HTTP表头信息
– addValue:forHTTPHeaderField:
– setValue:forHTTPHeaderField:

HTTP header的具体信息参见Wiki,常用的header一定要熟悉

http://en.wikipedia.org/wiki/List_of_HTTP_header_fields


1.2 三种上传数据的方式

NSData - 如果对象已经在内存里

使用以下两个函数初始化

uploadTaskWithRequest:fromData:
uploadTaskWithRequest:fromData:completionHandler: 

Session会自动计算Content-length的Header

通常,还需要提供一些服务器需要的Header,Content-Type就往往需要提供。



File-如果对象在磁盘上,这样做有助于降低内存使用。

使用以下两个函数进行初始化

 uploadTaskWithRequest:fromFile:
 uploadTaskWithRequest:fromFile:completionHandler:

同样,会自动计算Content-Length,如果App没有提供Content-Type,Session会自动创建一个。如果Server需要额外的Header信息,也要提供。



Stream

使用这个函数创建

uploadTaskWithStreamedRequest:

注意,这种情况下一定要提供Server需要的Header信息,例如Content-Type和Content-Length。

使用Stream一定要实现这个代理方法,因为Session没办法在重新尝试发送Stream的时候找到数据源。(例如需要授权信息的情况)。这个代理函数,提供了Stream的数据源。

URLSession:task:needNewBodyStream:

1 .3 代理方法

使用这个代理方法获得upload的进度。其他的代理方法

NSURLSessionDataDelegate,NSURLSessionDelegate,NSURLSessionTaskDelegate同样适用于UploadTask

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend;

二 上传数据

核心代码如下

    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://jsonplaceholder.typicode.com/posts"]];
    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];//这一行一定不能少,因为后面是转换成JSON发送的
    [request addValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setHTTPMethod:@"POST"];
    [request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
    [request setTimeoutInterval:20];
    NSDictionary * dataToUploaddic = @{self.keytextfield.text:self.valuetextfield.text};
    NSData * data = [NSJSONSerialization dataWithJSONObject:dataToUploaddic
                                                    options:NSJSONWritingPrettyPrinted
                                                      error:nil];
    NSURLSessionUploadTask * uploadtask = [self.session uploadTaskWithRequest:request fromData:data completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (!error) {
            NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
            self.responselabel.text = dictionary.description;
        }else{
            UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Error" message:error.localizedFailureReason preferredStyle:UIAlertControllerStyleAlert];
            [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:nil]];
            [self presentViewController:alert animated:YES completion:nil];
        }

    }];
    [uploadtask resume];

三 上传图片

核心部分代码

 NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.freeimagehosting.net/upload.php"]];
    [request addValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
    [request addValue:@"text/html" forHTTPHeaderField:@"Accept"];
    [request setHTTPMethod:@"POST"];
    [request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
    [request setTimeoutInterval:20];
    NSData * imagedata = UIImageJPEGRepresentation(self.imageview.image,1.0);

    NSURLSessionUploadTask * uploadtask = [self.session uploadTaskWithRequest:request fromData:imagedata completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSString * htmlString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        UploadImageReturnViewController * resultvc = [self.storyboard instantiateViewControllerWithIdentifier:@"resultvc"];
        resultvc.htmlString = htmlString;
        [self.navigationController pushViewController:resultvc animated:YES];
        self.progressview.hidden = YES;
        [self.spinner stopAnimating];
        [self.spinner removeFromSuperview];
    }];
    [uploadtask resume];

代理函数

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend{
    self.progressview.progress = totalBytesSent/(float)totalBytesExpectedToSend;
}


后续:网络部分,还会更新授权,证书一篇,AFNetworking一篇,一些网络的基本概念一篇。然后,转向更新数据存储这一块(CoreData以及IOS的文件系统)。

欢迎关注我的IOS-SDK详解专栏

http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html


时间: 2024-07-29 08:18:04

IOS 网络开发NSURLSession(四)UploadTask(上传数据+图片)的相关文章

IOS网络开发NSURLSession详解(一)概述

原创blog,转载请注明出处blog.csdn.net/hello_hwc 我的IOS-SDK详解专栏,欢迎关注 http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html 前言: 这个IOS网络编程的系列计划6篇文章,NSURLSession3篇(一篇概述,一篇详细阐述三种task和delegate的使用,一篇阐述授权,证书等内容),网络的基础知识两篇(一篇REST API讲解已经写完了,一篇我会把写博客的过程中遇到的概念总结出来

iOS开发--http协议 post上传数据

NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:@"123",@"longitude",@"30",@"latitude",@"上传数据",@"message",nil];    //dictionaryToNSJoson    NSError *err=nil;    NSData *jasonData=[NSJ

前端上传数据-图片和视频格式校验

上一篇用 promise 嵌套实现了按 excel 行顺序上传数据,这篇要解决的问题是图片和视频格式校验,图片主要有 jpg png gif 视频 mp4 由于用户选择的资源可能并不是真正的多媒体文件,使用 js 的 file.type 方法获取的文件类型可能不准确,比如将 .xlsx 改为 .jpg, file.type 得到的类型是image/jpeg 客户端拉取资源时,图片和视频的分辨率也一并获取,而上传由前端控制,所以上传时对资源要进行比较准确的判断. 我的判断策略: 判断文件后缀,若不

iOS多线程与网络开发之小文件上传

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源代码传送:http://dwz.cn/Nret1 A.文件上传 思路: 发送文件数据给server 使用post请求 必须手动设置请求头: 内

iOS多线程与网络开发之使用POST上传JSON数据 & 多值参数

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源码传送:http://dwz.cn/Nret1 A.上传JSON 1.思路: 必须使用POST方法才能上传大量JSON数据 设置请求头:设置Co

iOS网络-AFNetworking基本使用,文件下载,上传

发送GET请求 -(void)get { //1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; NSDictionary *dictM = @{ @"username":@"520it", @"pwd":@"520it", @"type":@"JSON" }; //2.发送请求 /* 第一个

xheditor1.1.14在asp.net网站开发中作为可上传本地图片的在线编辑器

xheditor是一个基于jQuery开发的跨平台轻量可视化XHTML编辑器,功能强大,使用方便,CSDN网站的发表文章网页就使用了该编辑器,下面介绍在vs2013的环境下开发网页时使用该编辑器并实现本地图片上传的一种方法. 1.网上搜索并下载文件xheditor1.1.1文件包,解压后应该是一个包括jquery.xheditor_emo.t xheditor_plugins. xheditor_skin.demos等文件夹及xheditor-1.1.14-zh-cn.min.js等文件的一个文

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

#import "ViewController.h" // ----WebKitFormBoundaryvMI3CAV0sGUtL8tr #define Kboundary @"----WebKitFormBoundaryjv0UfA04ED44AhWx" #define KNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding] @interface ViewController ()&l

iOS开发中文件的上传和下载功能的基本实现-备用

感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: 复制代码代码如下: YYViewController.m#import "YYViewController.h" #define YYEnc