网络下载图片大全

#import "ViewController.h"
#import "MyMD5.h"
@interface ViewController ()
{
    UIImageView *imgview;
    UIButton *loadbtn;
     float loadedFileSize;
    float totalFileSize;
}
@property(nonatomic,retain)NSMutableData *mutableData;
@property(nonatomic,retain)NSFileHandle *fileHandle;
@property(nonatomic,retain) NSURLConnection*httpRequest;

@end

@implementation ViewController

- (void)viewDidLoad {
    
    imgview=[[UIImageView alloc]initWithFrame:CGRectMake(0, 40, 300, 300)];
    imgview.backgroundColor=[UIColor redColor];
    [self.view addSubview:imgview];
    loadbtn =[[UIButton alloc]initWithFrame:CGRectMake(100, 350, 110, 110)];
    [loadbtn setTitle:@"下载图片" forState:UIControlStateNormal];
    loadbtn.backgroundColor=[UIColor blueColor];
    [loadbtn addTarget:self action:@selector(loadImage:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:loadbtn];

    //首先判断是否已经下载过,然后告知服务器从哪里下载,
   // (1)下载前需要先确定路径
  //  获取文件在沙盒中Documents下的全路径
    //我们把url作为文件名字-》但是url 中可能存在一些非法字符不能作为文件名,这时我们可以用md5 对文件名进行加密 产生一个唯一的字符串 (十六进制的数字+A-F表示),这样就可以保证文件名不出现非法字符
    NSString *url = [NSString stringWithFormat:@"http://pica.nipic.com/2007-12-12/20071212235955316_2.jpg"];
    NSString *fileName = [MyMD5 md5:url];//MD5
    NSLog(@"------------%@",fileName);
    //获取Documents
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    //拼接路径
    NSString *filePath = [docPath stringByAppendingPathComponent:fileName];
    NSLog(@"-------------path:%@",filePath);
 //   ***这里需要用到OC文件管理的知识!
    //创建文件(首先检测有没有存在,如果没有在创建)
    if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
        //检测文件是否存在
        //不存在那么要创建
        //NSFileManager 文件管理句柄
        [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
    }
    //如果已存在获取已近下载的大小,如果不存在那么大小为0;
    NSDictionary *fileDict = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
    //保存已经下载文件的大小
    //loadedFileSize = fileSize;
    //下载前需要打开文件
  self.fileHandle = [NSFileHandle fileHandleForWritingAtPath:filePath];
    //*****(如果服务器支持可变断点续传可以照用,如果不支持请忽略 头域)
    //把文件大小告知服务器
    //创建可变请求 增加请求头
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
    //增加头域 告知服务器 从 哪个字节之后开始下载(不了解头域的还是那句话百度),不支持头域的可以直接跳过
   // [request addValue:[NSString stringWithFormat:@"bytes=%llu-",fileSize] forHTTPHeaderField:@"Range"];
    //创建请求连接 开始异步下载
    _httpRequest = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
  //  NSURLConnectionDataDelegate
    //接收服务器响应
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
     //   在这里我们可以计算文件的总大小,获取数据的类型 : httpResponse.MIMEType ,数据的大小:
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
       // NSLog(@"url:%@",httpResponse.URL.absoluteString);
        //计算文件总大小 = 已经下载的+服务器将要发的
        //( self.loadedFileSize和上面关联着  数据是一段一段下载的)
        totalFileSize = loadedFileSize+httpResponse.expectedContentLength;
    }
    //接收数据过程 一段一段接收
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
        //都是OC文件管理的知识,我就不细说了吧
        //下载一段 写一段数据
        //先把文件偏移量定位到文件尾
        [_fileHandle seekToEndOfFile];
        //写文件
        [_fileHandle writeData:data];
        //立即同步到磁盘
        [_fileHandle synchronizeFile];
        //记录已经下载数据大小
        loadedFileSize += data.length;
        
        imgview.image =[UIImage imageWithData:data];
    }
    //下载完成一定要关闭呀
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
        [self stopDownload];//停止下载
    }
    //下载失败也要关闭呀
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
        [self stopDownload];
    }
    - (void)stopDownload {
        if (_httpRequest) {
            [_httpRequest cancel];
            _httpRequest = nil;
        }
        [_fileHandle closeFile];//关闭文件
    }

- (void)loadImage:(id)sender {
    /**
     *   @author aiqing, 17-11-19 16:11:24
     *第一种方法:
     * 
     NSURL *url = [NSURL URLWithString:@"http://pica.nipic.com/2007-12-12/20071212235955316_2.jpg"];
     
     dispatch_queue_t queue =dispatch_queue_create("loadImage",NULL);
     dispatch_async(queue, ^{
     
     NSData *resultData = [NSData dataWithContentsOfURL:url];
     UIImage *img = [UIImage imageWithData:resultData];
     
     dispatch_sync(dispatch_get_main_queue(), ^{
     imgview.image = img;
     });
     
     });
     */
    /**
     *   @author aiqing, 17-11-19 16:11:58
     *
     *第二种方法:
     NSURL *url = [NSURL URLWithString:@"http://pica.nipic.com/2007-12-12/20071212235955316_2.jpg"];
     NSData *resultData = [NSData dataWithContentsOfURL:url];
     UIImage *img = [UIImage imageWithData:resultData];
     imgview.image = img;
     */
    
    /**
     *   @author aiqing, 17-11-19 17:11:01
     *
     *第三种方法(异步下载:)要走下面的代理方法
     NSURL *url = [NSURL URLWithString:@"http://pica.nipic.com/2007-12-12/20071212235955316_2.jpg"];
     NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
     [request setURL:url];
     [request setHTTPMethod:@"GET"]; //设置请求方式
     [request setTimeoutInterval:60];//设置超时时间
     self.mutableData = [[NSMutableData alloc] init];
     [NSURLConnection connectionWithRequest:request delegate:self];//发送一个异步请求
     */
    

}
#pragma mark - NSURLConnection delegate
//数据加载过程中调用,获取数据
//- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
//    [self.mutableData appendData:data];
//}
//
////数据加载完成后调用
//- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
//    UIImage *image = [UIImage imageWithData:self.mutableData];
//    imgview.image = image;
//}
//
//- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
//    NSLog(@"请求网络失败:%@",error);
//}


你可能感兴趣的:(网络下载图片大全)