2017-07-13 3 views
1

ユーザーがボタンをクリックできるページがあり、PDFSharpドキュメントオブジェクトを生成する.NetバックエンドコントローラにWebAPI呼び出しを行います。 UIのKnockout/Javascript呼び出し元にそのオブジェクト(バイナリオブジェクト)を返し、別名で保存ダイアログを表示する必要があります。そうしないと、自動的にダウンロードが開始されます。PDFドキュメントをWebAPIにダウンロードする

これは私の試みですが、正しくはありません。

[System.Web.Http.Route("GeneratePdf"), System.Web.Http.HttpPost] 
     public HttpResponseMessage GeneratePdf(PlateTemplateExtendedDto data) 
     { 

      var doc = GeneratePdf(new PlateService().CreateTemplate(true), "my.pdf"); 

      HttpResponseMessage result = null; 

      var pdfContent = new MemoryStream(); 
      doc.Save(pdfContent); 

      result = Request.CreateResponse(HttpStatusCode.OK); 
      result.Content = new StreamContent(new FileStream(pdfContent, FileMode.Open, FileAccess.Read)); 
      result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
      result.Content.Headers.ContentDisposition.FileName = "SampleImg" 


      //pdfContent.Position = 0; 

      var res = new HttpResponseMessage(); 
      res.Content = new ByteArrayContent(pdfContent.ToArray()); 

      HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); 
      res.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
      res.Content.Headers.ContentDisposition.FileName = data.Description; 
      res.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); 

      return res; 
     } 

まず、ライン:

new StreamContent(new FileStream(pdfContent, FileMode.Open, FileAccess.Read)); 

は無効です。 'pdfContent'は文字列にする必要があります。

第2に、フロントエンドで 'HttpResponseMessage'を処理する方法がわかりません。それをダウンロードに変換するにはどうしたらいいですか?

+0

ので、あなたがどこかにPDFファイルを保存して返すことができませんクライアント側でwindow.locationのためにPlateTemplateExtendedDtoパラメータでAPIのURLを設定しますクライアントへのパスがリンクになる可能性がありますか? (これは通常、web api/knockoutを使用してpdfsを実行する方法です) –

+1

ここでは、asp.net-web-api https://stackoverflow.com/questions/36042614/how-to-returnからpdsを返す前の回答があります-A-PDF-from-a-web-api-application/36043779#36043779 – Nkosi

+0

@BryanDellinger - 確かにオプションですが、PDFの有効性は私がやっているプロセスにとってかなり短いので、ファイルを削除するか、フォルダを消去します。また、私は共有ホスティングで、私はファイルを保存するためのアクセス権を持っているかわからない。現時点では、画像をレンダリングしてディスクに保存せずに表示しています。私はpdfでこれを行うことができます。 – Craig

答えて

0

のWeb APIは、このようなものかもしれ..

 [System.Web.Http.Route("GeneratePdf"), System.Web.Http.HttpGet] 
     public IHttpActionResult GeneratePdf(PlateTemplateExtendedDto data) 
     { 
      var doc = GeneratePdf(new PlateService().CreateTemplate(true), "my.pdf"); 
      var pdfContent = new MemoryStream(); 
      doc.Save(pdfContent); 
      var content = new StreamContent(pdfContent); 
      content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); 
      content.Headers.ContentDisposition.FileName = data.Description; 
      content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); 
      content.Headers.ContentLength = pdfContent.GetBuffer().Length; 
      return Ok(content); 
     } 

あなただけ

関連する問題