Проверьте, существует ли URL-файл или нет - PullRequest
2 голосов
/ 28 июля 2011

Интересно, как я могу проверить, существует ли файл на сервере или нет, без предварительной загрузки данных.

У меня есть около 30 различных объектов, и некоторые из них связаны с фильмом на сервере.В настоящее время я использую NSData, чтобы контролировать, существует ли URL, а затем показывает фильм или нет, а затем предупреждает пользователя, что для этого объекта нет видео.Код, который я сейчас использую:

NSString *fPath = [[NSString alloc] initWithFormat:@"http://www.myserver/%@", [rows idNr]];
NSURL *videoURL = [NSURL URLWithString:fPath];
NSData *videoData = [NSData dataWithContentsOfURL:videoURL];

url = [NSURL URLWithString:fPath];
[fPath release];

if (videoData) {
    [self performSelectorOnMainThread:@selector(playVideo:) withObject:url waitUntilDone:NO];
} else {
    NSLog(@"videodata false");
    errorLabel.hidden = NO;
    activityView.hidden = YES;
}

"row idNr" - это имя объекта.Этот метод делает то, что я хочу, но проблема в том, что с NSData он сначала «загружает» файл, а когда URL проверяется как файл, фильм снова загружается в видеоплеер.Это означает, что загрузка файла занимает вдвое больше времени.

Предложения?

Ответы [ 5 ]

7 голосов
/ 28 июля 2011

Мне понадобилось время, чтобы выкопать мой ответ на один из предыдущих вопросов по этой теме . Цитата:

Вы можете использовать NSMutableURLRequest для отправки запроса HTTP HEAD (есть метод под названием setHTTPMethod). Вы получите то же самое заголовки ответа, как с GET, но вам не нужно загружать все тело ресурса. И если вы хотите получить данные синхронно, используйте sendSynchronousRequest… метод NSURLConnection.

Таким образом, вы узнаете, существует ли файл, и не загрузите все, если оно есть.

4 голосов
/ 30 мая 2013

Создайте объект URLConnecion с нужным URL-запросом и добавьте NSURLConnectionDelegate в файл .h, как я хочу проверить, существует ли * yoururl"или нет, тогда вам нужно сделать это

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString: @"http://www.google.com"]];

NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];

и затем вы можете отслеживать код статуса http в функции делегата NSURLConnectionDelegate

-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    int code = [(NSHTTPURLResponse *)response statusCode];
    if (code == 404)
    {
        // website not found
        // do your stuff according to your need 
    }
} 

Вы также можете найти различные коды состояния здесь .

1 голос
/ 19 августа 2014

Вот код принятого ответа (для вашего удобства):

Как позвонить

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
        [request setHTTPMethod:@"HEAD"];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
1 голос
/ 28 июля 2011
NSError *err;
if ([videoURL checkResourceIsReachableAndReturnError:&err] == NO)
   NSLog(@"wops!");
0 голосов
/ 28 июля 2011

Это можно сделать, проверив размер файла через FTP-сервер с помощью команды SIZE. Если размер файла равен нулю, то файл просто не существует.

Проверьте здесь о том, как это сделать.

Конечно, вы также можете сделать это, используя NSURLRequest с NSURLConnection, проверяя статус 200 (успех) или 404 (сбой). Состояние 404 не обязательно означает, что файл не существует, однако, возможно, файл просто не может быть получен.

...