Скачать файл, когда указан URL-адрес - iPhone sdk

Можно ли загрузить файл из Интернета, сохранить его в каталоге документов, когда указан URL-адрес? Я просмотрел некоторые документы на сайте разработчика Apple. Он сказал, что это возможно с помощью NSURLDownload, но его нельзя использовать в iOS. Таким образом, это следует делать с помощью NSURLConnection только в случае iOS. Итак, кто-нибудь, помогите мне загрузить файл (даже HTML-страницу) с заданного URL-адреса. Заранее спасибо.


person iOS    schedule 24.06.2011    source источник


Ответы (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;
}

Есть и другие фрагменты кода, которые я не показывал (свойства и т. д.), но я думаю, что этого должно быть достаточно, чтобы помочь вам.

person Nick Bull    schedule 24.06.2011
comment
Я использовал этот код, и он отлично работает, но я думаю, что есть пара вещей, которые нужно сказать, иначе люди с меньшим опытом не смогут заставить его работать: 1) NSURLConnection *conn лучше сделать его как переменную экземпляра или Xcode дать предупреждение, поскольку переменная не используется... 2) При запуске загрузки вам также необходимо инициализировать переменную activeDownload (self.activeDownload = [[NSMutableData alloc] init];), иначе она ничего не сохранит. - person Blue; 13.10.2013

Думаю, вам поможет библиотека 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]];
}
person Mario    schedule 24.06.2011
comment
Это для загрузки целых веб-страниц. Первоначальный вопрос просил загрузить файл. Можно ли с помощью этой библиотеки загружать произвольные файлы? - person Nick Bull; 24.06.2011
comment
Хорошо, я неправильно понял, но библиотека также может загружать обычные файлы любого размера. - person Mario; 24.06.2011
comment
Интересно узнать, что эта библиотека существует. Может пригодится в будущем! Спасибо за информацию. - person Nick Bull; 24.06.2011

Да. Вы можете сделать это с помощью 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];
}
person Deeps    schedule 24.06.2011
comment
Извините, я создал этот пользовательский класс Connection для личного использования. Вы можете просто replaceConnection *con = [[[Connection alloc] init]; con.delegate = сам; [[[NSURLConnection alloc] initWithRequest: запрос делегата: con] autorelease]; к этому NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest: делегат запроса: сам]; - person Deeps; 24.06.2011