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

时间:2017-01-09 08:28:38

标签: angular

我有一个简单的方法来检查本地计算机中是否存在*.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秒的超时,但是它只需要检查我的localhost中的文件。因此,我认为,它有足够的时间来查找文件。

它总是返回:

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

1 个答案:

答案 0 :(得分:2)

如果要编写一个发出GET请求状态代码的observable,可以执行以下操作:

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();
}