2016-10-28 11 views
13

私はASP.Net Web APIを備えたangular2プロジェクトを持っています。私は私のサーバー上のドキュメントに行く私のデータベースからファイルパスを取得するコードがあります。この文書をブラウザに新しいタブで表示したいと思います。誰にどのようにこれを行うための任意の提案がありますか?Angular2 PDFを表示

私はAngular2(活字体)のいずれか、あるいは私のAPIでファイルを取得し、それをダウンストリームに満足しています。

これは私のAPIでそれを取得する私の試みですが、私はAngular2でそれを受け取り、それを正しく表示する方法を考え出すことはできません。すべてのヘルプを

public HttpResponseMessage GetSOP(string partnum, string description) 
    { 
     var sopPath = _uow.EpicorService.GetSOP(partnum, description).Path; 
     HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 
     var stream = new FileStream(sopPath, FileMode.Open); 
     result.Content = new StreamContent(stream); 
     result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); 
     return result; 
    } 

をいただければ幸いです。

多くのありがとうございました!得るために

downloadPDF(): any { 
    return this._http.get(url, { responseType: ResponseContentType.Blob }).map(
    (res) => { 
      return new Blob([res.blob()], { type: 'application/pdf' }) 
     } 
} 

次に、:ResponseContentType.BlobresponseTypeを設定し、blobとして応答を読み、application/pdfにそのタイプを設定するためにblob()を使用 -

+0

あなたが別のタブでそれを見たい場合は、なぜ単にAPIのURLに新しいタブを開くと、ブラウザがコンテンツを解釈させませんか?おそらく、 "application/octet-stream"ではなく "application/pdf"のMIMEタイプを使用する必要があります。 – LinuxDisciple

+0

私はここで角度2の新しいタブでPDFファイルを取得して表示するように書いています。私の答えをチェックしてください:http://stackoverflow.com/questions/37046133/pdf-blob-is-not-showing-content-angular-2/ 39657478#39657478 –

+0

@StefanSvrkotaはそのまま私のAPIで動作しますか?それとも正しい形式で返すために変更を加える必要がありますか? – DaRoGa

答えて

25

まず第一に、あなたはhttpリクエストのオプションを設定する必要がありますファイル、あなたがそれにsubscribeする必要があり、新しいObjectURLを作成して、新しいタブでPDFを開くためにwindow.open()を使用することができます。

this.myService.downloadPDF().subscribe(
     (res) => { 
     var fileURL = URL.createObjectURL(res); 
     window.open(fileURL); 
     } 
    ); 
+0

こんにちは、ステファン。私はPDF文書を読み込めませんでした。助けてください。私はAngular4を使用しています。 – Mohit

+0

私はダウンロードできましたが、新しいブラウザタブに表示することができませんでした。 – user1892203

3

角度v.5.2.1の答え:

downloadPDF(): any { 
    return this._httpClient.get(url, { responseType: 'blob'}) 
      .map(res => { 
      return new Blob([res], { type: 'application/pdf', }); 
     }); 
    } 

そしてはサービスを呼び出す前に、新しいタブを開始し、開くことが、その後*.component.ts

downloadPDF() { 
    let tab = window.open(); 
    this._getPdfService 
     .downloadPDF() 
     .subscribe(data => { 
     const fileUrl = URL.createObjectURL(data); 
     tab.location.href = fileUrl; 
     }); 
    } 

におけるその重要。次に、このタブのurlをfileurlに設定します。

+0

objecturlをパラメータとして(選択した回答に示すように)開くのではなく、サービスを呼び出す前にタブを開くことが重要なのはなぜですか? –

+1

@PauFracésあなたがタブを「プログラマチックに」開くことを「許可」されていないので、ユーザーだけがタブを開くことができるので、ユーザーができるだけタブを開く必要があります。ボタンをクリックして 'downloadPDF()'を呼び出します。サブスクリプション内で、ユーザーとのやりとりがあまりにも遠すぎます。 – jonas