[解決済み】Angular2以上でファイルをダウンロードする方法
質問
私はWebApi / MVCアプリを持っており、そのためにangular2クライアントを開発しています(MVCを置き換えるために)。Angularがファイルを保存する方法を理解するのに苦労しています。
リクエストは問題ないのですが(MVCで問題なく動作し、受信したデータを記録することができます)、ダウンロードしたデータを保存する方法がわかりません(私はほとんど この記事 ). 私はそれが愚かなほど単純であることを確信していますが、今のところ私は単にそれを把握していません。
コンポーネント関数のコードは以下の通りです。いろいろな方法を試してみましたが、私が理解した限りでは、ブロブ方式がいいようです。
createObjectURL
で
URL
. の定義も見つからない。
URL
をウィンドウズで表示させることができますが、どうやら存在するようです。もし私が
FileSaver.js
モジュール
同じエラーが出ます。ということは、最近変わったか、まだ実装されていないものなのでしょう。A2でファイル保存をトリガーするにはどうしたらいいのでしょうか?
downloadfile(type: string){
let thefile = {};
this.pservice.downloadfile(this.rundata.name, type)
.subscribe(data => thefile = new Blob([data], { type: "application/octet-stream" }), //console.log(data),
error => console.log("Error downloading the file."),
() => console.log('Completed file download.'));
let url = window.URL.createObjectURL(thefile);
window.open(url);
}
念のため、データを取得するサービスを以下に示しますが、このサービスはリクエストを発行し、成功すればマッピングなしでデータを渡すだけです。
downloadfile(runname: string, type: string){
return this.authHttp.get( this.files_api + this.title +"/"+ runname + "/?file="+ type)
.catch(this.logAndPassOn);
}
解決方法は?
問題は、observable が別のコンテキストで実行されるため、URL var を作成しようとすると、空のオブジェクトが作成され、必要な blob が作成されないことです。
これを解決する方法は数多く存在するが、そのうちの1つが次のようなものである。
this._reportService.getReport().subscribe(data => this.downloadFile(data)),//console.log(data),
error => console.log('Error downloading the file.'),
() => console.info('OK');
リクエストの準備ができると、次のように定義された関数 "downloadFile" が呼び出されます。
downloadFile(data: Response) {
const blob = new Blob([data], { type: 'text/csv' });
const url= window.URL.createObjectURL(blob);
window.open(url);
}
もし、新しいウィンドウが開かない場合は、'rxjs/Rx' をすでにインポートしていることを確認してください。
import 'rxjs/Rx' ;
お役に立てれば幸いです。
関連
-
[解決済み】jquery $.ajaxオブジェクトのresponseJSONプロパティを取得する方法 [重複]。
-
[解決済み】このオブジェクトの "forEach "はなぜ関数でないのですか?
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] GUID / UUIDの作成方法
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Facebook Graph API のクエリで with=location を使用すると "Uncaught (in promise) undefined" というエラーが発生する。
-
[解決済み] 解決済み】clearInterval()が動作しない [重複] [重複]
-
[解決済み】XMLHttpRequestモジュールが定義されていない/見つからない
-
[解決済み】Reactのeslintエラーはpropsの検証で見つからない
-
[解決済み】getElementByIdはnullを返す?[クローズド]
-
[解決済み】FirefoxでGoogle Maps V3をリモートで使用すると「googleが定義されていません」と表示される。
-
[解決済み】Vueのテンプレートまたはレンダー関数が定義されていない 私はどちらも使っていないのですが?
-
[解決済み】Jestが予期しないトークンに遭遇した
-
[解決済み】Javascript、[オブジェクトHTMLInputElement]を表示中。]
-
[解決済み】リンクのないJavaScriptのblobファイル名