2017-01-09 23 views
0

ローカルマシンの*.mp3ファイルが存在するかどうかを確認する簡単な方法があります。 レスポンス(200,404,403など)のstatusが返されますが、動作しません。Angular2:http.getでファイルが存在することを確認してください

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…} 
+0

返されるステータスは、バックエンドであなたによって定義されます。いいえ? – Mox

+0

いいえ、http要求のステータスです。 – Salman

+0

http://stackoverflow.com/questions/36628498/angular2-http-error-handling – Habeeb

答えて

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メソッドを使用できます。

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

あなたの質問にある問題は、レスポンスで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(); 
} 
+0

しかし、何も返されません。ステータス200のファイルを見つけた場合はbooleanを返す必要があります。 – Salman

+0

'subscribe'コールバックの中から何も返すことはできません。それはちょうどそのようには動作しません。 'toPromise'演算子を使うと、合成された観測値を約束に変換することができます。私は答えを更新しました。 – cartant

+0

これはファイルが存在するかどうかをチェックするために使用できますが、他のファイルをロードするために存在しない場合は、ありがとうございます。 – profir

関連する問題