Скачать файл, когда URL-адрес предоставляется - iPhone SDK - PullRequest
1 голос
/ 24 июня 2011

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

Ответы [ 3 ]

4 голосов
/ 24 июня 2011

Вот пример получения изображения с сервера и сохранения его в файл.

Создайте переменные вашего экземпляра

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;
}

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

1 голос
/ 24 июня 2011

Думаю, библиотека 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]];
}
0 голосов
/ 24 июня 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];
}
...