我想知道如何检查服务器上是否存在文件,而不先下载数据。
我有大约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;
}
“rows idNr”是对象的名称。这个方法正在做我想要的,但问题是NSData首先“下载”文件,当URL被验证为文件时,电影再次加载到电影播放器中。这意味着加载文件需要两倍的时间。
建议?
答案 0 :(得分:7)
我花了一些时间来挖掘我对one of the previous questions on this topic的回答。引用:
您可以使用
NSMutableURLRequest
发送HTTP HEAD请求 (有一种名为setHTTPMethod
的方法)。你会得到同样的 响应标头与GET一样,但您不必下载整个 资源机构。如果您想同步获取数据,请使用NSURLConnection
的{{3}}方法。
通过这种方式,您可以知道该文件是否存在,如果存在则不会全部下载。
答案 1 :(得分:4)
创建一个带有所需网址请求的URLConnecion对象,并将NSURLConnectionDelegate
添加到.h文件中,就像我要检查“ yoururl ”是否存在然后您需要做的是
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString: @"http://www.google.com"]];
NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
然后您可以在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
}
}
您还可以找到各种状态代码here。
答案 2 :(得分:1)
NSError *err;
if ([videoURL checkResourceIsReachableAndReturnError:&err] == NO)
NSLog(@"wops!");
答案 3 :(得分:1)
以下是接受答案的代码(为方便起见):
如何拨打电话
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"HEAD"];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
答案 4 :(得分:0)
您可以使用SIZE命令通过FTP服务器检查文件大小来完成此操作。如果文件大小为零,则该文件根本不存在。
检查here如何执行此操作。
您当然也可以使用NSURLRequest
和NSURLConnection
来执行此操作,检查状态是200(成功)还是404(失败)。 404状态不一定是文件不存在,也可能是文件无法检索。