代码之家  ›  专栏  ›  技术社区  ›  Biranchi

在nsurlconnection中恢复下载功能

  •  10
  • Biranchi  · 技术社区  · 15 年前

    我正在用nsurlconnection类从服务器下载一些非常大的数据。

    如何实现暂停功能以便继续下载?

    2 回复  |  直到 11 年前
        1
  •  14
  •   Ben Gottlieb    15 年前

    从本质上说,您不能暂停,但可以取消连接,然后创建一个新连接以恢复旧连接中断的位置。但是,要连接的服务器必须支持范围头。将其设置为“bytes=size\u already\u downloaded-”,它应该会在您取消它的地方出现。

        2
  •  2
  •   user2683922    11 年前

    要继续下载并获取文件的其余部分,可以设置 Range 通过执行以下操作在http请求头中设置值:

    - (void)downloadFromUrl:(NSURL*)url toFilePath:(NSString *)filePath {
    
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url     cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
        if (!request) {
            NSLog(@"Error creating request");
            // Do something
        }
        [request setHTTPMethod:@"GET"];
    
        // Add header to existing file
        NSFileManager *fm = [NSFileManager defaultManager];
        if([fm fileExistsAtPath:filePath]) {
            NSError *error = nil;      
            NSDictionary * fileProp = [fm attributesOfItemAtPath:filePath error:&error];
            if (error) {
                NSLog(@"Error: %@", [error localizedDescription]);
                // Do something
            } else {
                // Set header to resume 
                long long fileSize = [[fileProp objectForKey:@"NSFileSize"]longLongValue];
                NSString *range = @"bytes=";
                range = [[range stringByAppendingString:[[NSNumber numberWithLongLong:fileSize] stringValue]] stringByAppendingString:@"-"];
                [request setValue:range forHTTPHeaderField:@"Range"];
            }
        }
        NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    
        if (!connection) {
            NSLog(@"Connection failed.");
            // Do something
        }
    }
    

    你也可以用 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 要通过检查预期大小检查现有文件是否已完全下载,请执行以下操作: [response expectedContentLength]; . 如果大小匹配,则可能需要取消连接。