关于NSURLSession的上传和下载

在iOS7.0后,苹果公司新推出了一个NSURLSession来代替NSURLConnection。NSURLConnection默认是在 主线程执行的。而NSURLSession是在其他线程上执行的。本篇主要实现了下载和上传,比起NSURLConnection更加简单。线程控制掌握 更加清晰。

#pragma mark -下载

- (IBAction)DownLoad

{

    //1.URL 

    NSString *urlStr = @"http://she.21cn.com/emotions/mingren/a/2014/0309/15/26645767.shtml";

    NSURL *url = [NSURL URLWithString:urlStr];

    //2.NSURLRequest

    NSURLRequest *request = [NSURLRequestrequestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:5.0];

    //3.NSURLSession

    NSURLSession *session = [NSURLSessionsharedSession];

    NSURLSessionDownloadTask *downLoad = [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {

        if (error) {

            NSLog(@"error = %@",error.localizedDescription);

        }else{

            // location是下载的临时文件目录

            NSLog(@"%@", location);

            // 如果要保存文件,需要将文件保存至沙盒

            // 1. 根据URL获取到下载的文件名

            NSString *fileName = [urlStr lastPathComponent];

            // 2. 生成沙盒的路径

            NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

            NSString *path = [docs[] stringByAppendingPathComponent:fileName];

            NSURL *toURL = [NSURL fileURLWithPath:path];

            // 3. 将文件从临时文件夹复制到沙盒,在iOS中所有的文件操作都是使用NSFileManager

            [[NSFileManager defaultManager] copyItemAtURL:location toURL:toURL error:nil];

            // 4. 将图像设置到UIImageView

            dispatch_async(dispatch_get_main_queue(), ^{

                UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];

                _imageView.image = image;

            });

        }

    }];

//4.因为任务默认是挂起状态,需要恢复任务(执行任务)

    [downLoad resume];

}

下载

#pragma mark -上传

- (IBAction)upLoad

{

    // 0. 判断imageView是否有内容

    if (_imageView.image == nil) {

        NSLog(@"image view is empty");

        return;

    }

    // 0. 上传之前在界面上添加指示符

    UIActivityIndicatorView *indicator = [[UIActivityIndicatorViewalloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];

    // 设置位置???

    CGSize size = _imageView.bounds.size;

    indicator.center = CGPointMake(size.width / 2.0, size.height / 2.0);

    [self.imageView addSubview:indicator];

    [indicator startAnimating];

    // 1. URL

    NSString *urlStr = @"http://192.168.3.251/uploads/123.jpg";

    NSURL *url = [NSURL URLWithString:urlStr];

    // 2. Request -> PUT,request的默认操作是GET

    NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:5.0f];

    request.HTTPMethod = @"PUT";

    // *** 设置网络请求的身份验证! ***

    // 1> 授权字符串

    NSString *authStr = @"admin:123456";

    // 2> BASE64的编码,避免数据在网络上以明文传输

    // iOS中,仅对NSData类型的数据提供了BASE64的编码支持

    NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];

    NSString *encodeStr = [authData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

    NSString *authValue = [NSString stringWithFormat:@"Basic %@", encodeStr];

    [request setValue:authValue forHTTPHeaderField:@"Authorization"];

    // 3. Session

    NSURLSession *session = [NSURLSessionsharedSession];

    // 4. UploadTask

    NSData *imageData = UIImageJPEGRepresentation(_imageView.image, 0.75);

    NSURLSessionUploadTask *upload = [session uploadTaskWithRequest:request fromData:imageData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

        // 上传完成后,data参数转换成string就是服务器返回的内容

        NSString *str = [[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding];

        NSLog(@"OK -> %@", str);

        if (error != nil) {

            NSLog(@"ERROR -> %@", error.localizedDescription);

        } else {

        }

        [NSThreadsleepForTimeInterval:5.0f];

        dispatch_async(dispatch_get_main_queue(), ^{

            [indicator stopAnimating];

            [indicator removeFromSuperview];

        });

    }];

    [upload resume];

}

上传

苹果原生NSURLSession的上传和下载的更多相关文章

  1. 通读AFN②--AFN的上传和下载功能分析、SessionTask及相应的session代理方法的使用细节

    这一部分主要研究AFN的上传和下载功能,中间涉及到各种NSURLSessionTask的一些创建的解析和HTTPSessionManager对RESTful风格的web应用的支持,同时会穿插一点NSU ...

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

    感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ...

  3. SpringMVC 实现文件上传与下载,并配置异常页面

    目录 上传文件的表单要求 Spring MVC实现上传文件 需要导入的jar包 配置MultipartResolver解析器 编写接收上传文件的控制器 Spring MVC实现文件下载 下载文件时的h ...

  4. Day10 上传和下载

    上传 将本地文件传输到服务器 jsp:  文件上传的请求方式必须是post  input的type必须是file  enctype="multipart/form-data" ...

  5. javaweb基础整理随笔-----上传与下载步骤详解

    这次整理的是上传与下载的原生代码解析: 上传:1.对页面的要求:enctype="multipart/form-data" method="post"      ...

  6. Spring MVC 上传、下载、显示图片

    目录 1. 准备工作 1.1 数据库表准备 1.2 实体类 User 和 Mapper(DAO) 1.3 pom.xml 依赖包 1.4 SSM 框架的整合配置 2. 控制器 UserControll ...

  7. javaWeb文件上传与下载

    文件上传与下载在项目中运用的使用频率很大 今天也花时间整理了一下 多文件上传图片回显 和文件下载  1.多文件上传 这里会涉及到几个属性 fileSizeThreshold:缓冲区文件的大小 如果上传 ...

  8. java实现大文件上传和下载

    [文件上传和下载]是很多系统必备功能, 比如PM\OA\ERP等:系统中常见的开发模式有B/S和C/S,而前者主要是通过浏览器来访问web服务器,一般采用七层协议中的[应用层http]进行数据传输,后 ...

  9. Struts1.3——文件上传和下载

    1.Struts文件上传 在Web开发中,会经常涉及到文件的上传和下载,比如在注册账户的时候,我们需要上传自己的头像等. 我们可以利用Struts很方便地实现文件的上传. 1.1 开发步骤 现在,假设 ...

随机推荐

  1. COM编程之五 动静态链接

    [1]静态链接 静态链接是指由链接器在链接时将库的内容加入到可执行程序中的做法. 链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序. 函数和数据被编译 ...

  2. COM编程之一 组件

    [1]组件产生的背景 一个应用程序通常是由单个二进制文件组成的. 当应用程序版本发布后一般不会发生任何变化,对于操作系统.硬件以及客户需求的改变都必须要等到修复源代码后且整个应用程序被重新编译才可处理 ...

  3. 上海某(hong)冠笔试题

    1.解释Spring的ioc和aop 首先想说说IoC(Inversion of Control,控制倒转).这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring ...

  4. 【python cookbook】【数据结构与算法】7.让字典保持有序

    问题:创建一个字典,同时对字典做迭代或序列化操作时,也能控制其中元素的顺序: 解决方案:可以使用collections模块中的OrderedDict类来控制字典中元素的顺序.当对字典做迭代时,他会严格 ...

  5. iOS 学习笔记 六 (2015.03.28)常见错误

    2015.03.28 1. property's synthesized getter follows Cocoa naming convention for returning 'owned' ob ...

  6. 使用jprofiler8远程监控weblogic的配置方法

    jprofiler8的注册码:L-Larry_Lau@163.com#36573-fdkscp15axjj6#25257 未完待续

  7. Objective-C占位符

    %@ 对象 %d, %i 整数 %li 长整型 %u 无符号整形 %f 浮点/双字 %x, %X 二进制整数 %o 八进制整数 %zu size_t %p 指针 %e 浮点/ 双字 (科学计算) (d ...

  8. 常用的math函数

    <?php    //1.abs — 绝对值                      echo abs(-77);      //ceil — 进一法取整                   ...

  9. mount/umount系统调用

    转载自:http://blog.sina.com.cn/s/blog_6385c7310100iqmn.html 功能描述: mount挂上文件系统,umount执行相反的操作.    用法:   # ...

  10. ACM学习之路————一个大整数与一个小整数不得不说得的秘密

    这个相对于两个大整数的运算来说,只能说是,low爆了. 只要利用好除法的性质,这类题便迎刃而解.O(∩_∩)O哈哈~ //大整数除一个int数 #include<iostream> #in ...