2012-04-25 6 views
4

Я загружаю документы в формате PDF с сервера:Как сохранить загруженные данные в файловой системе устройства

- (void)downloadSingleDocument:(NSURL *)url 
{ 
    [pdfData release]; 
    pdfData = [[NSMutableData alloc] init]; 
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; 
    [req addValue:@"Basic **************=" forHTTPHeaderField:@"Authorization"]; 
    downloadConnection = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES]; 
} 

- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data 
{ 
    NSLog(@"Connection did receive data"); 
    [pdfData appendData:data]; 
} 

На connectionDidFinishLoading Я хочу, чтобы сохранить загруженный файл в формате PDF в файловую систему в каталоге документов с тем же именем, как это было на сервер. Каков наилучший способ сделать это?

ответ

5

Используйте эти методы, если у вас есть большой файл:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse*)response 
{ 
    filepath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:save_name]; 
    [[NSFileManager defaultManager] createFileAtPath:filepath contents:nil attributes:nil]; 
    file = [[NSFileHandle fileHandleForUpdatingAtPath:filepath] retain];// Here file is object of NSFileHandle and its declare in .h File 

    [file seekToEndOfFile]; 

} 



- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 

[file seekToEndOfFile]; 

[file writeData:data]; 
} 


- (void)connectionDidFinishLoading:(NSURLConnection*)connection 
{ 
    [file closeFile]; 
// After you download your data. you can copy your data from here to filesystem. and remove from here 
} 
+0

"// После того, как вы загрузите свои данные, вы можете скопировать свои данные отсюда в файловую систему и удалить здесь" Не могли бы вы подробно описать этот процесс? Как скопировать его в файловую систему, а затем удалить? – Oleg

+0

@Oleg Извините за поздний ответ. см. это: http: //developer.apple.com/library/ios/#documentation/Cocoa/Reference/NSFileManagerDelegate_Protocol/Reference/Reference.html # // apple_ref/doc/uid/TP40009948 – Hector

+0

Спасибо! Это рабочее решение, которое я искал! Ответ принят! – Oleg

-1

Это должно сделать это

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    NSString *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 

    NSString *filename = [con.originalRequest.URL lastPathComponent]; 
    NSString *path = [documentsDirectory stringByAppendingString:filename]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    [fileManager createFileAtPath:path contents:pdfData attributes:nil]; 

} 
+1

В качестве общей стратегии для загрузки PDF-файлов, это не здорово. Вы загружаете весь файл в ОЗУ, а затем сериализуете его на диск. Это означает, что большие PDF-файлы приведут к краху приложения, так как в нем заканчивается память. – Jim

+0

Кроме того, если вы собираетесь хранить файл-менеджер по умолчанию в локальной переменной, вы также можете сделать это в начале метода и устранить один из избыточных вызовов 'defaultManager'. – Jim

+0

Я получаю исключение Заключительное приложение из-за неперехваченного исключения «NSInvalidArgumentException», причина: '- [NSURL stringByAppendingString:]: нераспознанный селектор, отправленный в экземпляр 0xee91c00'. Вероятно, мне нужно использовать absoluteString для преобразования NSURL в NSString. Также вы могли бы предложить, как я могу декодировать имя файла из «file% 20name.pdf» в «file name.pdf»? – Oleg

2

Использование NSURLDownload.

К сожалению, это доступно только на Mac, а не для iOS.

Создайте временный файл и добавьте полученные данные к нему в connection:didReceiveData:. В поле connectionDidFinishLoading: переместите файл в нужное место, а в connection:didFailWithError: удалите временный файл.

+0

Но я думаю, что NSURLDownload недоступен для iOS ... То, что эта ссылка говорит ... Исправьте меня, если я Я ошибаюсь –

+0

Ах, конечно, моя ошибка. Обновление ответа сейчас. – Jim

+0

Ха-ха .. Хорошо ... Но мне интересно, как OLEG отвечал на ответ :) –

Смежные вопросы