You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过NSURL与NSURLSession检测服务器文件是否存在?

嘿,针对你的问题,先给你明确结论:用NSURLSession检测服务器文件存在性是完全可行的,不过你目前的代码还缺核心逻辑,我帮你补全并优化;另外也有更适合的方案可以参考。

现有方案的可行性与代码补全

你的思路没问题——核心逻辑是通过HTTP响应状态码判断文件状态:200/206代表文件存在,404代表不存在,其他状态码可按需处理。这里给你补全并优化后的代码,重点做了效率提升:

- (void)testFichierExiste:(void(^)(int intTest))retourErreur atURL:(NSURL *)cheminTest {
    // 用ephemeral配置(无缓存、无持久化cookie)很适合这类单次检测请求
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config];
    
    // 关键优化:使用HEAD请求,只获取响应头不下载文件内容,带宽和速度都更高效
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:cheminTest];
    request.HTTPMethod = @"HEAD";

    NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        // 回到主线程处理回调,避免UI操作报错
        dispatch_async(dispatch_get_main_queue(), ^{
            if (error) {
                // 网络错误等异常情况,返回自定义错误码(比如-1)
                retourErreur(-1);
                return;
            }

            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
            if (httpResponse.statusCode == 200 || httpResponse.statusCode == 206) {
                // 文件存在
                retourErreur(0);
            } else if (httpResponse.statusCode == 404) {
                // 文件不存在
                retourErreur(1);
            } else {
                // 其他异常状态码(比如403权限不足、500服务器错误),直接返回状态码
                retourErreur(httpResponse.statusCode);
            }
        });
    }];

    [task resume];
}
更优方案推荐

如果你的服务器是自己可控的,还有两个更靠谱的方案:

  • 后端提供专门检测接口:比如写一个/api/check-file接口,接收文件路径参数,直接返回JSON结果(比如{"exists": true})。这种方式逻辑更清晰,还能避免服务器自定义404页面导致状态码误判的问题。
  • 利用HTTP缓存策略:如果检测的文件更新不频繁,可以给请求设置缓存策略(比如NSURLRequestReturnCacheDataElseLoad),减少重复请求的网络开销。
调用示例

给你一个简单的调用测试代码:

NSURL *testFileURL = [NSURL URLWithString:@"https://your-server.com/target-file.pdf"];
[self testFichierExiste:^(int intTest) {
    switch (intTest) {
        case 0:
            NSLog(@"✅ 文件存在");
            break;
        case 1:
            NSLog(@"❌ 文件不存在");
            break;
        case -1:
            NSLog(@"⚠️ 网络请求出错");
            break;
        default:
            NSLog(@"⚠️ 服务器返回异常状态码:%d", intTest);
            break;
    }
} atURL:testFileURL];

内容的提问来源于stack exchange,提问作者Clem Sb

火山引擎 最新活动