Angular2:使用 http.get 检查文件是否存在

Sal*_*ara 2 angular

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

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

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

\n\n

它总是返回:

\n\n
Subscriber {closed: false, syncErrorValue: null, syncErrorThrown: false, syncErrorThrowable: false, isStopped: false\xe2\x80\xa6}\n
Run Code Online (Sandbox Code Playgroud)\n

car*_*ant 5

如果你想编写一个发出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}`));
Run Code Online (Sandbox Code Playgroud)

如果您想更有效地根据 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}`));
Run Code Online (Sandbox Code Playgroud)

您的问题中的代码的问题是您正在响应中查找 JSON 内容,并且正在查找status该内容中的内容。这status是在响应本身中。

但是,要实现确定文件存在的函数,您甚至不需要检查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();
}
Run Code Online (Sandbox Code Playgroud)