Можно ли загрузить файл из Интернета, сохранить его в каталоге документов, когда указан URL-адрес? Я просмотрел некоторые документы на сайте разработчика Apple. Он сказал, что это возможно с помощью NSURLDownload, но его нельзя использовать в iOS. Таким образом, это следует делать с помощью NSURLConnection только в случае iOS. Итак, кто-нибудь, помогите мне загрузить файл (даже HTML-страницу) с заданного URL-адреса. Заранее спасибо.
Скачать файл, когда указан URL-адрес - iPhone sdk
Ответы (3)
Вот пример получения изображения с сервера и его сохранения в файл.
Создайте свои переменные экземпляра
NSMutableData *activeDownload;
NSURLConnection *imageConnection;
Теперь создайте свое соединение
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
NSURL *url = [[NSURL alloc] initWithString:@"URL TO FILE"];
[request setURL:url];
[url release];
url = nil;
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
Обработка получения данных
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[self.activeDownload appendData:data];
}
Передача завершена, сохраните данные
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *fileName = [[paths objectAtIndex:0] stringByAppendingPathComponent:self.imageFileName];
[self.activeDownload writeToFile:fileName atomically:YES];
self.activeDownload = nil;
self.imageConnection = nil;
}
Есть и другие фрагменты кода, которые я не показывал (свойства и т. д.), но я думаю, что этого должно быть достаточно, чтобы помочь вам.
Думаю, вам поможет библиотека ASIHTTPRequest :)
ASIWebPageRequest
Класс ASIWebPageRequest, входящий в состав ASIHTTPRequest, позволяет загружать полные веб-страницы, включая внешние ресурсы, такие как изображения и таблицы стилей.
Пример кода с сайта allseeing-i.com
- (IBAction)loadURL:(NSURL *)url
{
// Assume request is a property of our controller
// First, we'll cancel any in-progress page load
[[self request] setDelegate:nil];
[[self request] cancel];
[self setRequest:[ASIWebPageRequest requestWithURL:url]];
[[self request] setDelegate:self];
[[self request] setDidFailSelector:@selector(webPageFetchFailed:)];
[[self request] setDidFinishSelector:@selector(webPageFetchSucceeded:)];
// Tell the request to embed external resources directly in the page
[[self request] setUrlReplacementMode:ASIReplaceExternalResourcesWithData];
// It is strongly recommended you use a download cache with ASIWebPageRequest
// When using a cache, external resources are automatically stored in the cache
// and can be pulled from the cache on subsequent page loads
[[self request] setDownloadCache:[ASIDownloadCache sharedCache]];
// Ask the download cache for a place to store the cached data
// This is the most efficient way for an ASIWebPageRequest to store a web page
[[self request] setDownloadDestinationPath:
[[ASIDownloadCache sharedCache] pathToStoreCachedResponseDataForRequest:[self request]]];
[[self request] startAsynchronous];
}
- (void)webPageFetchFailed:(ASIHTTPRequest *)theRequest
{
// Obviously you should handle the error properly...
NSLog(@"%@",[theRequest error]);
}
- (void)webPageFetchSucceeded:(ASIHTTPRequest *)theRequest
{
NSString *response = [NSString stringWithContentsOfFile:
[theRequest downloadDestinationPath] encoding:[theRequest responseEncoding] error:nil];
// Note we're setting the baseURL to the url of the page we downloaded. This is important!
[webView loadHTMLString:response baseURL:[request url]];
}
Да. Вы можете сделать это с помощью NSURLConnection. Вам нужно сделать запрос к URL. Что-то вроде этого.
NSString *strDownloadURL = @"File URL";
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:strDownloadURL]];
Connection *con = [[[Connection alloc] init];
con.delegate=self;
[[[NSURLConnection alloc]initWithRequest:request delegate:con] autorelease];
Теперь в методе делегата соединения didReceiveData присвойте NSData глобальной переменной.
- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data {
if (receivedData != nil) {
[receivedData appendData:data];
} else {
receivedData = [[NSMutableData alloc] initWithData:data];
}
}
Наконец, в методе делегата соединения «connectionDidFinishLoading» у вас должны быть данные файла в формате NSData. Так что сохраните его в каталоге документов примерно так.
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[receivedData writeToFile:DocumentPathtoSaveFile atomically:YES];
}