2017-08-26 19 views
0

Angularアプリでpdfファイルをダウンロードしようとしています。サーバ(JBossは)アタッチメントに設定Angular4 GET応答で 'Content-Disposition'ヘッダーを表示できません

Content-type : application/pdf and Content- Disposition

ヘッダとファイルを提供しています。 これらのヘッダーは、フィドラーレスポンスでかなりよく見えます。しかし、私の購読のコールバックで私は同じヘッダーを見ることができません。代わりに、ヘッダーには2つのプロパティが含まれています。 _headers and _normalizedHeaders

GET呼び出し中です。私が行います

`this._http.get(url, {responseType: 'arraybuffer'}).subscribe((file: Response)=>{ 

    //Cant find headers in file here 

});` 

はまた、私はRequestContentType.BlobにresponseTypeを設定しようと、それはどちらかの差は行われません。

ダウンロードの実装には、AngularJSを使用して添付ファイルをダウンロードするためのコードがあります。私はContent-Dispositionヘッダーを読むためにここで苦労しています。

また、{ observe : response }を設定しようとしましたが、そのような詳細な応答を期待しています。ただし、GET optionsでは、そのプロパティを設定する理由がいくつかあります。

私はSOの多くの回答を見て、それらのほとんどを試しましたが、まだヘッダーを取得できませんでした。

P.S:ブラウザに直接APIを当てるとダウンロードされたファイルが得られます。これはJavaコードが正常であることを意味し、上記のコードで何が間違っているのだろうかと思います。

提案をリクエストしています。

答えて

0

Evansさんが提案したAccess-Control-Expose-HeaderssetExposedHeadersの助けを借りて、以下のようにファイルをダウンロードできました。 Javaコードで

、あなたはとしてCORSを使用して行うことができAccess-Control-Expose-Headers、公開する必要があります。これは、サーバーの応答で必要なヘッダを公開します

CorsFilter corsFilter = new CorsFilter(); 
    corsFilter.setAllowedHeaders("Content-Type, Access-Control-Allow-Headers, Access-Control-Expose-Headers, Content-Disposition, 
    Authorization, X-Requested-With"); 
    corsFilter.setExposedHeaders("Content-Disposition"); 

を。あなたのクライアントで

、あなたは正確なコードの下を使用して応答を処理することができますが:

private processDownloadFile() { 
       const fileUrl = this._downloadUrl; 
       this.http.get(fileUrl, ResponseContentType.ArrayBuffer).subscribe((data: any) => { 
       const blob = new Blob([data._body], { type: data.headers.get('Content-Type')}); 
       const contentDispositionHeader = data.headers.get('Content-Disposition'); 
       if (contentDispositionHeader !== null) { 
        const contentDispositionHeaderResult = contentDispositionHeader.split(';')[1].trim().split('=')[1]; 
        const contentDispositionFileName = contentDispositionHeaderResult.replace(/"/g, ''); 
        const downloadlink = document.createElement('a'); 
        downloadlink.href = window.URL.createObjectURL(blob); 
        downloadlink.download = contentDispositionFileName; 
        if (window.navigator.msSaveOrOpenBlob) { 
         window.navigator.msSaveBlob(blob, contentDispositionFileName); 
        } else { 
         downloadlink.click(); 
        } 
       } 
       }); 
    } 

勿論、私は1つの場所ですべてを書きました。さまざまなコールバックをモジュール化することができます。

いつか誰かを助けることを願っています。

0

HIは、あなたは、あなたがあなたが公開必要

public downloadCSVFile(){ 
this.downloadPdf().subscribe(
    (res) => {  
     saveAs(res,'test.pdf') 
    } 
); 
} 

public downloadPdf(): any { 
    let url='your url' 
    let headers = new Headers(); 
    headers.append('Authorization', 'JWT ' + localStorage.getItem('id_token')); 
    return this.http.get(url,{ headers: headers,responseType: ResponseContentType.Blob }).map(
    (res) => { 
     return new Blob([res.blob()], { type: 'application/pdf' }) 
    }) 


    } 

を試すことができ、「NPMファイル・セーバー・--saveをインストールする」のようにインストールし、私たちは、このパッケージのファイル・セーバーを必要とするこの

のように試すことができます角度(または他のWebアプリケーション)にアクセスできるように、サーバーによって送信されたカスタムヘッダーのために裏打ちされたから「のContent処分」のヘッダ(JBossサーバ)

+0

ありがとう@Robert、私はそれを達成するための外部モジュールを探していませんが。私は私のケースを助けたコードを掲載しました。 –

+0

Okay super @SaurabhTiwari – Robert

0

それはそうあなたAccess-Control-Expose-Headersに存在しなければなりませんrブラウザはあなたのAngular Appにそれを渡すことはなく、あなたの開発者ツールがそれを示していてもそれを取得することはできません。

+0

私はJavaでこれをやっていて、CORSの一部として次のヘッダーを設定しています: 'corsFilter.setAllowedHeaders(" Content-Type、Access-Control-Allow-Headers、Access-Control- Content-Length、Authorization、X-Requested-With)」);他に提案する方法はありますか? –

+0

あなたのコードを注意深く見てみると、 'Access-Control-Allow-Headers'を設定し、' Access-Control-Expose-Headers'を許可ヘッダーの一部として含めることに気づくでしょう。私はこれがJavaでどのように行われているのかよくわかりませんが、 'corsFilter.setExposedHeaders(" custom header、customer、header ")のようなものもあるはずです。 –

+0

' corsFilter.setExposedHeaders( "Content-Disposition、Content-Type" ); '私の既存のコードに。これにより、ファイルがダウンロードされます。しかし、驚いたことに、ダウンロードしたファイルをクリックすると「PDF文書を読み込めませんでした」というポップアップが表示されます。これはよく知られていますか? –

関連する問題