2013-10-16 101 views
0

我希望能夠使用AFNetworking下載文件,該文件支持:ProgressBar,暫停和恢復下載。使用AFNetworking在iOS中下載文件

在接近這個我自己,我能夠想出這個代碼,但它不支持暫停或恢復:

-(void)downloadFile:(NSString *)UrlAddress indexPathofTable:(NSIndexPath *)indexPath 
{ 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:UrlAddress]]; 
    NSString *pdfName = [self pdfNameFromURL:UrlAddress]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:pdfName]; 
    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 
    { 
     NSLog(@"Successfully downloaded file to %@", path); 
     [self.tableView reloadData]; 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    { 
     NSLog(@"Error: %@", error); 
    }]; 
    [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) 
    { 
     //do something in this line with the calculation to cell 
     float progress = (float)totalBytesRead/totalBytesExpectedToRead; 
     [[NSNotificationCenter defaultCenter] postNotificationName:[NSString stringWithFormat:@"progress-%ld-%ld", (long)indexPath.section, (long)indexPath.row] object:@(progress)]; //Working reporting progress in cellForRowAtIndexPath. 
    //NSLog(@"Download = %f", progress); 
    }]; 
     [operation start]; 
} 

事情是,我不知道如何管理暫停&恢復。

看着他們的文檔:(https://github.com/AFNetworking/AFNetworking),他們提供了不同的方式來下載文件:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 

NSURL *URL = [NSURL URLWithString:@"http://www.irs.gov/pub/irs-pdf/fw4.pdf"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:URL]; 

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { 
    NSURL *documentsDirectoryPath = [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]]; 
    return [documentsDirectoryPath URLByAppendingPathComponent:[targetPath lastPathComponent]]; 
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { 
    NSLog(@"File downloaded to: %@", filePath); 
}]; 
[downloadTask resume]; 

我期望「fw4.pdf」在我的iOS」的文件夾正確命名。然而,這是記錄的結果:

文件下載到:文件:///Users/myName/Library/Application%20Support/iPhone%20Simulator/7.0/Applications/F4C3BC41-70B4-473A-B1F6-D4BC2A6D0A4F/Documents /CFNetworkDownload_ZkSW5n.tmp

上面的文件被下載,但帶有怪異的臨時名稱。

我在我自己的代碼中實現我正在使用「AFHTTPRequestOperation」對象,而他們正在使用「AFURLSessionManager」。

任何想法?

+0

我想你會在這裏找到解決方案。 http://stackoverflow.com/questions/8004808/afnetworking-using-afhttprequestoperation-to-download-file –

+0

該解決方案有幾乎一樣的我的解決方案(使用AFHTTPRequestOperation) – Demasterpl

回答

-2

下載文件:

NSData* data = [[NSData alloc] initWithContentsOfURL:/*your URL*/]; 

並稍後保存:

NSString *documentsDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"test.pdf"]; 
    [data writeToFile:path atomically:YES]; 

或者你讀CFNetworkDownload_ZkSW5n.tmp與PDF擴展寫:

NSData* data = [[NSData alloc] initWithContentsOfFile: PathYourFile]; 
    //save code above 
+0

這並不能掩蓋AFNetowrking(你使用所有Apple API),也不支持暫停,進度條或恢復。 ( – Demasterpl

+0

我編輯我的答案) – user2828120

+0

也許'[操作setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *操作,id響應對象) { NSData * data =(NSData *)responseObject; }' – user2828120

3
- (void)downloadFile{ 

NSURL *url = [NSURL URLWithString:@"http://198.61.234.81/expris/uploads/attachments/file_1.pdf"]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
AFHTTPSessionManager *session = [AFHTTPSessionManager manager]; 
NSProgress *progress; 
NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { 

    NSURL *documentsDirectoryPath = [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]]; 

    //Here is change 
    return [documentsDirectoryPath URLByAppendingPathComponent:[response suggestedFilename]]; 

}completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { 

    [progress removeObserver:self forKeyPath:@"fractionCompleted" context:NULL]; 

    dispatch_async(dispatch_get_main_queue(), ^(void){ 

     NSLog(@"File downloaded to: %@", filePath); 


    }); 

}]; 

[downloadTask resume]; 
[progress addObserver:self 
      forKeyPath:@"fractionCompleted" 
       options:NSKeyValueObservingOptionNew 
       context:NULL]; 

}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 
NSProgress *progress = (NSProgress *)object; 
NSLog(@"Progress… %f", progress.fractionCompleted); 
} 
+0

請刪除觀察者,因爲它是由於這個崩潰,並刪除這一切後工作正常。 –

+0

已被更新回答。感謝@DhruvNarayanSingh指點。 – Spydy

+0

,你提供了很好的答案。 –