问题 从URL下载文件并保存到iPhone上的资源


是否可以通过编程方式将文件(即sqlite数据库文件)从Internet下载到您的iPhone应用程序中,以便以后在应用程序中使用?

我正在尝试使用 NSURLConnection,但无法保存文件。

这是我正在尝试的示例代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *file = [NSString stringWithFormat:@"http://en.wikipedia.org/wiki/Text_file"];
    NSURL *fileURL = [NSURL URLWithString:file];

    NSURLRequest *req = [NSURLRequest requestWithURL:fileURL];
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self];  
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [self.fileData setLength:0];
    self.totalFileSize = [NSNumber numberWithLongLong:[response expectedContentLength]];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
        [self.fileData appendData:data];        
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSArray *dirArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,    NSUserDomainMask, YES);
    NSLog(@"%@", [dirArray objectAtIndex:0]);

    NSString *path = [NSString stringWithFormat:@"%@/blah.text", [dirArray objectAtIndex:0]];

    if ([self.fileData writeToFile:path options:NSAtomicWrite error:nil] == NO) {
        NSLog(@"writeToFile error");
    }
    else {
        NSLog(@"Written!");
    }
}

4785
2018-01-20 15:01


起源

究竟什么失败了? - Vladimir
if([self.fileData writeToFile:path options:NSAtomicWrite error:nil] == NO){NSLog(@“writeToFile error”);我得到“writeToFile错误” - msk


答案:


什么是fileData?它是如何定义和初始化的?

  fileData = [NSMutableData data];

应该在以下某个地方:

NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self];

您必须初始化fileData并按内存管理规则保留它。

试试我的回答。有用!


5
2018-01-20 15:18



是的,它在头文件中以这种方式定义。 - msk
我在上面的viewDidLoad中没有看到它。在哪里初始化??? fileData = [NSMutableData data]; - Jordan
正如我在我的回答(在viewDidLoad中)中所说的那样初始化fileData并且它将起作用。 - Jordan
你需要:fileData = [[NSMutableData alloc] initWithLength:0];或fileData = [NSMutableData data]; in - (void)viewDidLoad。 - Jordan
谢谢,这有帮助。 - msk


你需要扩展路径 stringByAppendingPathComponent

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"bookdb.sql"];

4
2018-01-20 15:18



我想从Internet下载数据库(存储在某个服务器上的某个地方) - msk
没关系,你还需要扩大〜 - slf


在方法中尝试此代码并执行,

NSURL *url=[NSURL URLWithString:@"http://en.wikipedia.org/wiki"];

NSData *dbFile = [[NSData alloc] initWithContentsOfURL:url];   

NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent]stringByAppendingPathComponent:@"Documents"]];

NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"Text_file.txt"];  

[dbFile writeToFile:filePath atomically:YES];

4
2017-07-10 10:49



文件目录的URL更好这种方式 - > NSURL * documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];您可以[URL路径]来获取路径 - coolcool1994


这对你有用。

NSString *stringURL = @"http://www.somewhere.com/thefile.png";
NSURL  *url = [NSURL URLWithString:stringURL];
NSData *urlData = [NSData dataWithContentsOfURL:url];
if ( urlData )
{
  NSArray       *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString  *documentsDirectory = [paths objectAtIndex:0];  

  NSString  *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"filename.png"];
  [urlData writeToFile:filePath automically:YES];
}

请注意,这是一个 writeToFile 方法是同步的,因此它将暂停/阻止您的UI。


0
2018-03-31 21:27