源码0602-06-掌握-小文件下载-大文件下载

//
//  ViewController.m
//  06-掌握-小文件下载
#import "ViewController.h"

@interface ViewController () <NSURLConnectionDataDelegate>
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
/** 文件数据 */
@property (nonatomic, strong) NSMutableData *fileData;
/** 文件的总长度 */
@property (nonatomic, assign) NSInteger contentLength;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //要请求url文件
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_15.mp4"];
    [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:url] delegate:self];//使用代理
}

#pragma mark - <NSURLConnectionDataDelegate>
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response
{  //接收到了响应;
    self.contentLength = [response.allHeaderFields[@"Content-Length"] integerValue];  //拿到响应头,得到下载文件的总大小,目的计算下载的百分比;  //self.contentLength 要拿到下面用,so给了个强引用;
    self.fileData = [NSMutableData data];//接收到响应后,才创建这个临时存放数据的数据对象;要拿到写入沙盒那一步使用;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{  //不断的收数据,数据的拼接;收一点写一点去沙盒;
    [self.fileData appendData:data];
    CGFloat progress = 1.0 * self.fileData.length / self.contentLength;//下载百分比
    NSLog(@"已下载:%.2f%%", (progress) * 100);
    self.progressView.progress = progress;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{  //上一步的数据收集完了;
    NSLog(@"下载完毕"); //来到缓存沙盒路径,拼接文件路径,将收完的数据写入这个文件路径,临时的存放数据对象清空;

    // 将文件写入沙盒中

    // 缓存文件夹
    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

    // 文件路径
    NSString *file = [caches stringByAppendingPathComponent:@"minion_15.mp4"];

    // 写入数据
    [self.fileData writeToFile:file atomically:YES];
    self.fileData = nil;
}

- (void)connDownload
{  //异步请求网路图片;
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_15.png"];
    [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:url] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        NSLog(@"%zd", data.length);
    }];
}
//文件下载其实就是get请求,能发get请求的就能下载;
- (void)dataDownlaod
{  //使用网络上的图片;
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_15.png"];
    //适合下载小文件;没有办法断点下载,暂停
    NSData *data = [NSData dataWithContentsOfURL:url];

    NSLog(@"%zd", data.length);
}

@end

07-掌握-大文件下载

//  ViewController.m
//  06-掌握-小文件下载
#import "ViewController.h"

#define XMGFile [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"minion_15.mp4"]

@interface ViewController () <NSURLConnectionDataDelegate>
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
/** 文件的总长度 */
@property (nonatomic, assign) NSInteger contentLength;
/** 当前下载的总长度 */
@property (nonatomic, assign) NSInteger currentLength;

/** 文件句柄对象 */
@property (nonatomic, strong) NSFileHandle *handle;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_15.mp4"];
    [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:url] delegate:self];
}

#pragma mark - <NSURLConnectionDataDelegate>
/**
 * 接收到响应的时候:创建一个空的文件
 */
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response
{
    // 获得文件的总长度
    self.contentLength = [response.allHeaderFields[@"Content-Length"] integerValue];

    // 创建一个空的文件
    [[NSFileManager defaultManager] createFileAtPath:XMGFile contents:nil attributes:nil];

    // 创建文件句柄
    self.handle = [NSFileHandle fileHandleForWritingAtPath:XMGFile];//fileHandlewritingAtPath用来写文件的
}

/**
 * 接收到具体数据:马上把数据写入一开始创建好的文件
 */
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // 指定数据的写入位置 -- 文件内容的最后面
    [self.handle seekToEndOfFile];//挪到最后面

    // 写入数据
    [self.handle writeData:data];//从最后面开始写入数据;

    // 拼接总长度
    self.currentLength += data.length;

    // 进度
    self.progressView.progress = 1.0 * self.currentLength / self.contentLength;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // 关闭handle
    [self.handle closeFile];
    self.handle = nil;

    // 清空长度
    self.currentLength = 0;
}

@end
时间: 2024-10-11 11:32:37

源码0602-06-掌握-小文件下载-大文件下载的相关文章

【小程序源码案例】微信小程序项目开发案例分享

作者:web小二本文标签: 微信小程序 小程序源码案例 小程序项目小程序的开发,并不是适合所有公司,我今天跟大家分享小程序方面的教程,主要是供大家学习使用.学习这种东西,有时候则是单纯的喜欢,没有任何目的,很单纯的为了好玩,记得很早之前学flash,没有想法,就是觉得好玩,纯娱乐爱好而已.到后来玩视频剪辑也是出于同样的原因,不图钱财名利,只是图自己个人爱好娱乐. 但是,学习,有时候则是需要有明确目的,特别是关系到自己吃饭问题的时候,你就需要非常有目的去学习,并且还需要制定好学习的计划与目标,希望

永利国际源码搭建什么是小程序

简单来说小程序是一种不需要下载安装即可使用的应用,它实现了应用"×××"的梦想,用户扫一扫或搜一下即可打开应用.小程序点开既用完既走不占用内存,他还带有记忆功能比如别人点开过这个小程序,它将永远留在这个人的微信,发现里面.永利国际源码搭建QQ:2152876294 网址diguaym.com小程序的好处有哪些??1.服务和体验更有优势:先不说无需下载即可安装这个优势,小程序的核心主要是针对一些轻度用户和新用户,提供基础服务,有一个重要的特点就是:能简化用户路径去享受更好的服务,通过碎片

ios开发网络学习三:NSURLConnection小文件大文件下载

一:小文件下载 #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> /** 注释 */ @property (nonatomic, strong) NSMutableData *fileData; @property (nonatomic, assign) NSInteger totalSize; @property (weak, nonatomic) IB

[c#源码分享]TCP通信中的大文件传送

源码   (为节省空间,不包含通信框架源码,通信框架源码请另行下载) 文件传送在TCP通信中是经常用到的,本文针对文件传送进行探讨 经过测试,可以发送比较大的文件,比如1个G或者2个G 本文只对文件传送做了简单的探讨,示例程序可能也不是很成熟,希望本文起到抛砖引玉的作用,有兴趣的朋友帮忙补充完善 首先看一下实现的效果 服务器端: 客户端(一次只能发送一个文件): 服务器端收到的文件,存放到了D盘根目录下(存放的路径可以根据情况修改) 本程序基于开源的networkcomms2.3.1通信框架 下

菠菜源码搭建与微信小程序Demo

demo 的界面设计以及交互设计 工具 菠菜源码搭建QQ:2152876294 网址diguaym.com已经全面对非邀请内测用户开放, 且在持续更新(我码代码的过程中就更新了两版, 所以开发时 IDE 版本不唯一) 不过其实忍受了半个小时微信的开发者工具之后, 我就改在 webstorm 中编辑了, 微信工具成了运行预览的工具, 不过听说IDE 中预览的效果, 也不能保证与真机一样哦~ 设计和功能: 知乎安卓版本 非常之简易版数据: 毕竟是知乎, 为了防止版权问题, fake 的数据使用的是我

Spring AMQP 源码分析 06 - 手动消息确认

### 准备 ## 目标 了解 Spring AMQP 如何手动确认消息已成功消费 ## 前置知识 <Spring AMQP 源码分析 04 - MessageListener> ## 相关资源 Offical doc:<http://docs.spring.io/spring-amqp/docs/1.7.3.RELEASE/reference/html/_reference.html#message-listener-adapter> Sample code:<https:

PHP彩票源码论坛 API设计的十大原则

1.只做你今天需要的这是最顶级的规则,只解决今天必须解决的问题,PHP彩票源码论坛bbs.yasewl.com最小化需要完成的答案.解决明天的问题的诱惑力是巨大的,但是一定要顶住诱惑!不要提前发布代码,重点是注重缩小发布周期.如果需要花几个小时的时间来回答新问题,那么就不用再猜测明天会出现什么问题了. 2.API模块化将大型问题转化为规模较小的.可单独解决的问题.模块化API更容易学习,并且可以随时间而改变.你可以用新模块替代旧模块,可以一个一个地教导模块,也可以将API的实验部分从稳定或传统的

非常适合新手的jq/zepto源码分析06 -- 事件模型

复习下事件的有关内容: 1.现在用的绑定/删除: obj.addEventListener(type,fn,false) obj.removeEventListener(type) obj.attachEvent(type,fn)   //ie obj.detachEvent(type) 2.js的event对象 type : 事件类型 srcElement/target :  事件源 button : 如果是鼠标按下,则 1左键 2右键 4中间滚轮 多个键则相加按下的所有值. firfox 0

zepto源码学习-06 touch

先上菜,看这个模块的最后一段代码,一看就明白. ['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'doubleTap', 'tap', 'singleTap', 'longTap' ].forEach(function(eventName) { $.fn[eventName] = function(callback) { return this.on(eventName, callback) } }) tap —元素tap

文件下载(大文件下载)

#import "SZMViewController.h" @interface SZMViewController () <NSURLSessionDownloadDelegate> @end @implementation SZMViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically fro