`
jsntghf
  • 浏览: 2542791 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

文件下载

    博客分类:
  • iOS
阅读更多

主要是用到了一个自定义的下载类,例子中包括了:同步下载、异步下载、身份验证。

 

DownLoadHelper.h

 

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@protocol DownLoadHelperDelegate <NSObject>

@optional
-(void) didReceiveData:(NSData *)theData;
-(void) didReceiveFilename:(NSString *)aName;
-(void) dataDownloadFailed:(NSString *)reason;
-(void) dataDownloadAtPercent:(NSNumber *)aPercent;

@end

@interface DownLoadHelper : NSObject {
	NSURLResponse *respone;
	NSMutableData *data;
	NSString *urlString;
	NSURLConnection *urlconnection;
	id <DownLoadHelperDelegate> delegate;
	BOOL isDownloading;
	
	NSString *username;
	NSString *userpassword;
}
@property(nonatomic ,retain) NSURLResponse *respone;
@property(nonatomic ,retain) NSMutableData *data;
@property(nonatomic ,retain) NSString *urlString;
@property(nonatomic ,retain) NSURLConnection *urlconnection;
@property(nonatomic ,retain) id delegate;
@property(assign) BOOL isDownloading;
@property(nonatomic ,retain) NSString *username;
@property(nonatomic ,retain) NSString *userpassword;

+(DownLoadHelper *) sharedInstance;
+(void) download:(NSString *)aURLString;
+(void) cancel;
@end

 

DownLoadHelper.m

 

#import "DownLoadHelper.h"

static DownLoadHelper *sharedInstance = nil;
@implementation DownLoadHelper
@synthesize respone;
@synthesize data;
@synthesize urlString;
@synthesize urlconnection;
@synthesize delegate;
@synthesize isDownloading;
@synthesize username,userpassword;

-(void)start{
	self.isDownloading = NO;
	NSURL *url = [NSURL URLWithString:self.urlString];
	if (!url) {
        
		NSString *reason = [NSString stringWithFormat:@"Could not create URL from string %@",self.urlString];
		if (sharedInstance.delegate && [sharedInstance.delegate respondsToSelector:@selector(dataDownloadFailed:)]) {
			[sharedInstance.delegate performSelector:@selector(dataDownloadFailed:) withObject:reason];
			return;
		}
	}
	
	NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
	if (!theRequest) {
		NSString *reason = [NSString stringWithFormat:@"Could not create URL request from string %@",self.urlString];
		if (sharedInstance.delegate && [sharedInstance.delegate respondsToSelector:@selector(dataDownloadFailed:)]) {
			[sharedInstance.delegate performSelector:@selector(dataDownloadFailed:) withObject:reason];
			return;
		}
	}
	
	self.urlconnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
	if (!self.urlString) {
		NSString *reason = [NSString stringWithFormat:@"URL connection failed for string %@",self.urlString];
		if (sharedInstance.delegate && [sharedInstance.delegate respondsToSelector:@selector(dataDownloadFailed:)]) {
			[sharedInstance.delegate performSelector:@selector(dataDownloadFailed:) withObject:reason];
			return;
		}
	}
	
	self.isDownloading = YES;
	
	self.data = [NSMutableData data];
	self.respone = nil;
	[self.urlconnection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
	if (!username || !userpassword) {
		[[challenge sender] useCredential:nil forAuthenticationChallenge:challenge];
		return;
	}
	NSURLCredential *cred = [[[NSURLCredential alloc] initWithUser:self.username password:self.userpassword persistence:NSURLCredentialPersistenceNone] autorelease];
	[[challenge sender] useCredential:cred forAuthenticationChallenge:challenge];
}

-(void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
	NSLog(@"Challenge cancelled");
}

-(void)cleanup{
	self.data = nil;
	self.respone = nil;
	self.urlconnection = nil;
	self.urlString = nil;
	self.isDownloading = NO;
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)aresponse{
	self.respone = aresponse;
	if ([aresponse expectedContentLength] < 0) {
		NSString *reason = [NSString stringWithFormat:@"Invalid URL [%@]",self.urlString];
		if (sharedInstance.delegate && [sharedInstance.delegate respondsToSelector:@selector(dataDownloadFailed:)]) {
			[sharedInstance.delegate performSelector:@selector(dataDownloadFailed:) withObject:reason];
		}
		[connection cancel];
		[self cleanup];
		return;
	}
	
	if ([aresponse suggestedFilename]) {
		if (sharedInstance.delegate && [sharedInstance.delegate respondsToSelector:@selector(didReceiveFilename:)]) {
			[sharedInstance.delegate performSelector:@selector(didReceiveFilename:) withObject:[aresponse suggestedFilename]];
		}
	}
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)theData{
	[self.data appendData:theData];
	if (self.respone) {
		float exectedlength = [self.respone expectedContentLength];
		float currentLength = self.data.length;
		float percent = currentLength / exectedlength;
		if (sharedInstance.delegate && [sharedInstance.delegate respondsToSelector:@selector(dataDownloadAtPercent:)]) {
			[sharedInstance.delegate performSelector:@selector(dataDownloadAtPercent:) withObject:[NSNumber numberWithFloat:percent]];
		}
	}
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
	self.respone = nil;
	if (self.delegate) {
		NSData *theData = [self.data retain];
		if (sharedInstance.delegate && [sharedInstance.delegate respondsToSelector:@selector(didReceiveData:)]) {
			[sharedInstance.delegate performSelector:@selector(didReceiveData:) withObject:theData];
		}
	}
	[self.urlconnection unscheduleFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
	[self cleanup];
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
	self.isDownloading = NO;
	NSLog(@"Error:failed connection ,%@",[error localizedDescription]);
	if (sharedInstance.delegate && [sharedInstance.delegate respondsToSelector:@selector(dataDownloadFailed:)]) {
		[sharedInstance.delegate performSelector:@selector(dataDownloadFailed:) withObject:@"Failed Connection"];
	}
	[self cleanup];
}

+(DownLoadHelper *)sharedInstance{
	if (!sharedInstance) {
		sharedInstance = [[self alloc] init];
	}
	return sharedInstance;
}

+(void)download:(NSString *)aURLString{
	if (sharedInstance.isDownloading) {
		NSLog(@"Error:Cannot start new download until current download finishes");
		if (sharedInstance.delegate && [sharedInstance.delegate respondsToSelector:@selector(didReceiveData:)]) {
			[sharedInstance.delegate performSelector:@selector(didReceiveData:) withObject:@""];
		}
		return;
	}
	
	sharedInstance.urlString = aURLString;
	[sharedInstance start];
}

+(void)cancel{
	if (sharedInstance.isDownloading) {
		[sharedInstance.urlconnection cancel];
	}
}

@end

 

分享到:
评论

相关推荐

    不需要会员的文档下载器

    在提供的压缩包文件中,“ExuiKrnln_Win32.lib”可能是一个动态链接库文件,用于支持“萝卜头文档下载器.exe”的功能实现。这类库文件通常包含可被其他程序调用的函数,可能包含了解析网页、模拟登录、抓取下载链接...

    基于java的book118文档下载器.zip

    总之,"基于Java的book118文档下载器"是一个综合运用了网络请求、HTML解析、文件操作等多种Java技术的实用工具,其具体实现会涉及到网络编程、数据解析、文件I/O等多个计算机科学和技术领域。对于学习Java编程和网络...

    在线文档下载器

    在线文档下载器可能使用此库来解析和处理从网站下载的PDF文件,确保用户可以本地存储和阅读这些文档。 “iDocDown.exe”是主程序执行文件,是在线文档下载器的核心部分。它包含了实现下载功能的算法和逻辑,能够...

    ajax实现java文件下载

    6. **新建 文本文档.txt**:这可能是示例中的一个测试文件,用于演示如何通过Ajax进行下载。在实际应用中,这个文件的名称和类型将由用户选择或由业务逻辑决定。 具体实现步骤: 1. **前端**:在JSP文件中,使用...

    萝卜头文档下载器1.1

    萝卜头文档下载器是一款Windows端的免费文档下载工具,可以帮助我们下载各种常用文档,降低获取成本!软件下载好后无需安装,就可以直接打开使用。 界面非常的干净整洁,支持下载的范围也非常广泛,支持范文、协议书...

    收费文档下载方法c.zip

    这些工具能够解析百度文库的页面,抓取文档内容并将其转换成本地文件。使用这类工具时,用户需要复制百度文库文档的网页链接,然后粘贴到工具的输入框内,按照提示进行操作。值得注意的是,这种方法可能受制于网站的...

    豆丁网文件下载器

    豆丁网免费下载器(冰点)无需登录也无需积分,只需要将需要下载的文档的网页地址复制在软件的录入框中就可以自由下载,并最终生成pdf文件。对部分pdf文件能够提取文字生成txt。 豆丁网免费下载器还支持自由下载百度、...

    Visual Studio 2010 帮助文件下载助手

    visual studio 2010的帮助文档很难下载,一方面文件很多很大,全部文档超过1GB,使用微软自带的 或者辅助工具,由于没有发挥多线程和断点续传的特点,下载速度很慢,容易失败。 另一方面迅雷等下载工具,可以实现...

    国密文档下载链接

    国密规范文档所有标准稳当的下载链接,SM2/SM3/SM4/SM9等,各种国密产品检测规范

    文档下载器.zip

    【描述】"文档下载器" 提供了一个集成化的解决方案,让用户能够轻松下载网络上的文档资源,特别是可能存在于各种文档分享平台上的PDF、SWF等格式的文件。它可能包含了用于处理不同文件类型的组件,以及一些支持程序...

    冰点文档下载器,支持下载网页百度文档

    在提供的压缩包子文件“Fish-v324-0712”中,我们可以推测这可能是冰点文档下载器的一个版本,其中可能包含了软件的执行文件、帮助文档、许可证文件等组成部分。用户在下载这个压缩包后,需要解压并按照指示安装和...

    pb实现http文件下载功能--源代码 可以直接使用

    标题中的“pb实现http文件下载功能--源代码 可以直接使用”指的是使用PowerBuilder(简称PB)编程语言实现HTTP协议进行文件下载的功能,并且提供了可以直接使用的源代码。这个功能在软件开发中常用于实现自动更新...

    豆丁文档下载破解器

    豆丁文档下载破解器. 豆丁文档下载破解器. 豆丁文档下载破解器.

    csv文件下载(人员信息.txt)

    由于在学习numpy数据分析的时候没有csv类型文件,又懒得自己一个个敲字,便想来csdn里随便下载一个。然而......居然要钱啊!!!!!!!我没钱,所以自己写了个,我不要你们的钱,麻烦各位拿资源的时候吱一声,这是...

    百度或豆丁的原始文件 下载 免积分

    标题中的“百度或豆丁的原始文件 下载 免积分”指的是从百度文库或豆丁网这两个在线文档分享平台上获取原始文件的方式,通常这些平台为了盈利,会限制用户免费下载高质量的文档,需要消耗积分或者购买。但这个标题...

    豆丁当当文档下载

    综上所述,"豆丁当当文档下载"涉及到的技术点包括文档分享平台的使用、文件下载工具、文件格式转换(如SWF到PDF)、文档管理以及特定平台的文件格式(如DOCIN)。这些工具和服务的使用可以帮助用户更有效地获取和...

    豆丁文档下载工具无需登录

    为了解决这一问题,豆丁文档下载工具应运而生,旨在为用户提供无需登录即可下载豆丁网文档的途径,从而节约宝贵的时间和精力。 豆丁网提供的是一个集合了各类专业文档、研究报告和学习资料的资源宝库。无论是在学术...

    豆丁文档下载器 简体中文绿色修正版

    豆丁文档下载器是一款专为用户设计的工具,主要用于从豆丁网下载各种电子文档。豆丁网作为国内知名的在线文档分享平台,汇集了大量专业报告、学习资料、课件、学术论文等资源,但其部分文档需要付费才能查看或下载。...

    豆丁网免费下载工具,可把豆丁网文件下载成pdf文件

    总的来说,豆丁网免费下载工具是为了解决无法直接下载豆丁网文档的问题,它通过将网页转换为PDF格式,使用户能够离线阅读和保存文件。在使用过程中,用户应关注版权问题,合理使用工具,并掌握一定的PDF文件管理技巧...

Global site tag (gtag.js) - Google Analytics