如何从互联网上下载文件并保存在iPhone上的“文档”中?

时间:2009-08-26 02:56:57

标签: iphone uikit download directory

我的远程服务器上有一个文件夹,里面有几个.png文件。我想从我的应用程序中下载这些内容并将它们存储在应用程序的“文档”文件夹中。我怎么能这样做?

1 个答案:

答案 0 :(得分:13)

简单的方法是使用NSData的便捷方法initWithContentOfURL:writeToFile:atomically:分别获取数据并将其写出。请记住,这是同步的,并将阻止您执行它的任何线程,直到获取和写入完成。

例如:

// Create and escape the URL for the fetch
NSString *URLString = @"http://example.com/example.png";
NSURL *URL = [NSURL URLWithString:
              [URLString stringByAddingPercentEscapesUsingEncoding:
                          NSASCIIStringEncoding]];

// Do the fetch - blocks!
NSData *imageData = [NSData dataWithContentsOfURL:URL];
if(imageData == nil) {
    // Error - handle appropriately
}

// Do the write
NSString *filePath = [[self documentsDirectory] 
                      stringByAppendingPathComponent:@"image.png"];
[imageData writeToFile:filePath atomically:YES];

documentsDirectory方法从this question无耻地被盗:

- (NSString *)documentsDirectory {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                         NSUserDomainMask, YES);
    return [paths objectAtIndex:0];
}

但是,除非您打算自己进行自选,否则这将在文件下载时停止UI活动。您可能希望查看NSURLConnection及其委托 - 它在后台下载并通知代理有关异步下载的数据,因此您可以构建NSMutableData的实例,然后在连接完成时将其写出来。您的代理可能包含以下方法:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // Append the data to some preexisting @property NSMutableData *dataAccumulator;
    [self.dataAccumulator appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // Do the write
    NSString *filePath = [[self documentsDirectory] 
                          stringByAppendingPathComponent:@"image.png"];
    [imageData writeToFile:filePath atomically:YES];
}

小细节,如声明dataAccumulator和处理错误,留给读者:)

重要文件: