2016-09-09 4 views
3

Angular 2アプリケーションでファイルをPOSTするメソッドを実装しました。それは私が見つけた解決策に基づいていますhereObservableでxhr.send()の後にサーバーの応答を取得

Angular 2はファイルアップロードを単独でサポートしていないため、解決方法はxhrを利用する必要があります。

コンポーネント方法:

onSubmit(): void { 
    this.inputModuleService.postFile(this.files).subscribe(() => { 
     console.log('sent'); 
    }); 
} 

サービス方法:

postFile (files: File[]): Observable<string> { 
    var url = this.uploadURL; 

    return Observable.create(observer => { 
     var formData: FormData = new FormData() 
     var xhr: XMLHttpRequest = new XMLHttpRequest(); 

     formData.append("upload", files[i], files[i].name); 

     xhr.onreadystatechange =() => { 
      if (xhr.readyState === 4) { 
       if (xhr.status === 200) { 
        observer.next(JSON.parse(xhr.response)); 
        observer.complete(); 
       } else { 
       observer.error(xhr.response); 
       } 
      } 
     }; 

     xhr.open('POST', url, true); 
     xhr.send(formData); 
    }); 
} 

私の問題は、私は戻って応答を取得する方法を理解していないということですがこれは実用的なソリューションは、次のようになりますxhr.send()の呼び出しの後にonSubmit()メソッドに渡します。 Angular2とObservableと約束のコンセプトは私にとって初めてのものです。

この監視対象からサーバーの応答を取得するにはどうすればよいですか?

答えて

1

サーバの応答はsubscribe()の成功とエラーコールバックに提供されます。

onSubmit(): void { 
    this.inputModuleService.postFile(this.files).subscribe(
     response => { 
      //response is the server's response, parsed into a javascript object 
      console.log('server responded: ', response); 
     }, 
     error => { 
      //server response emitted when xhr.status !== 200 
      console.error(error); 
     } 
    ); 
} 

この行を:iが定義されていないので

formData.append("upload", files[i], files[i].name); 

は、エラーをスローします。コピー元のコードにループ内のその行があり、iが現在のインデックスでした。それはあなたのコードでは当てはまりません。

あなたの関数宣言:postFileによって返された観察可能なオブジェクトではなく、文字列を発するので

postFile (files: File[]): Observable<string> 

postFile (files: File[]): Observable<any> 

に変更する必要があります。

あなたが1つのファイルだけをアップロードすることを意味している場合、あなたはまた、file: Filefiles: File[]を変更して、ファイルを追加する必要があります

formData.append("upload", file, file.name); 
+0

私は一時的な変更を行った後のことでした未定義 'i'、のための私の悪いです。詳細な回答をありがとうございます。観測値は常に「」ですか? – Juicy

+1

いいえ、オブザーバブルはどのタイプでも出力できます。文字列だけが必要な場合は、 'Observable 'を使用できます。数値かブール値を期待するならば、 'Observable ' ... – BeetleJuice

関連する問題