【问题标题】:Angular2: check file existance with http.getAngular2:使用 http.get 检查文件是否存在
【发布时间】:2017-01-09 08:28:38
【问题描述】:

我有一个简单的方法来检查我的本地机器中的*.mp3 文件是否存在。 它应该返回响应的status(200、404,403等),但它不起作用。

fileExists(url){
        return this.http.get(url).timeout(2000)
                                 .map(res=>res.json())
                                 .subscribe(
                                           res=>{
                                                 console.log("res is");
                                                 console.log(res.status)
                                                 return res.status;},
                                           err =>{ 
                                                  console.log("Error is");
                                                   console.log(err.status); 
                                                   return err.status});

  }

我为它设置了 2 秒的超时时间,但它只需要检查我的本地主机中的文件。因此,我认为,它有足够的时间找到文件。

它总是返回:

Subscriber {closed: false, syncErrorValue: null, syncErrorThrown: false, syncErrorThrowable: false, isStopped: false…}

【问题讨论】:

  • 返回的状态是你在后台定义的。没有?
  • 不是,是http请求的状态。
  • @Salman,你使用什么后端框架?如果您使用的是 apache 之类的后端,那么您将把它留给 apache 来为您提供状态,如果您使用的是 nodejs/django 之类的后端,您可能需要定义如何获取文件?

标签: angular


【解决方案1】:

如果您想编写一个发出GET 请求状态码的可观察对象,您可以这样做:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/map';

this.http.get("/some-file.txt")
    .map((response) => response.status)
    .catch((error) => Observable.of(error.status || 404))
    .subscribe((status) => console.log(`status = ${status}`));

如果您想根据 HTTP 状态码更有效地确定文件是否存在,您可以使用 HEAD 方法,该方法不会检索文件的内容:

this.http.head("/some-file.txt")
    .map((response) => response.status)
    .catch((error) => Observable.of(error.status || 404))
    .subscribe((status) => console.log(`status = ${status}`));

您问题中代码的问题是您正在响应中寻找 JSON 内容,并在该内容中寻找 statusstatus 在响应本身中。

然而,要实现一个确定文件存在的函数,你甚至不需要检查status

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/mapTo';
import 'rxjs/add/operator/toPromise';

getFileStatus(path: string): Promise<boolean> {
    return this.http.head(path)
        .mapTo(true)
        .catch((error) => Observable.of(false))
        .toPromise();
}

【讨论】:

  • 但它不返回任何东西。如果找到状态为 200 的文件,我需要它返回一个布尔值
  • 你不能从subscribe回调中返回任何东西;它只是不能那样工作。您可以使用 toPromise 运算符将组合的 observable 转换为 Promise。我已经更新了答案。
  • 这个可以用来检查文件是否存在,如果不存在则加载其他文件,谢谢。
猜你喜欢
  • 2011-06-26
  • 2012-07-19
  • 1970-01-01
  • 2022-06-10
  • 2017-10-02
  • 2021-12-25
相关资源
最近更新 更多