2016-04-13 14 views
0

私は、コントローラのアクションがあります。ajax POSTとASP.net MVC FileStreamResultを使用して新しいブラウザウィンドウにPDFファイルを表示するには?

public ActionResult GetReport(List<int> idList) 
{ 
    Stream stream = ReportsComponent.GetReports(idList); 
    return File(stream, "application/pdf"); 
} 

私はjavascriptを持っていることをアクセスするには:

$.ajax({ 
    method: "POST", 
    url: "/Reports/GetReport", 
    data: { idList : idsList} 
}) 
.then(function(data){ 
     /*Not working*/ 
     var blob=new Blob([data], {type: "application/pdf"}); 

     var fileURL = URL.createObjectURL(blob); 
     window.open(fileURL); 
     /*Not working*/ 
    }, 
    function(){ 
     //error 
    } 
); 

は、これまでのところ、私は(動作していないコードで)破損したPDFを取得しています。結果のPDFを新しいブラウザウィンドウに表示するにはどうすればよいですか?

+2

ajaxを使用してファイルをダウンロードすることはできません。ファイルを返すメソッドにリダイレクトする必要があります。 –

+0

**あなたは** POSTリクエストをしなければなりませんか?それをGETリクエストに変更すると、ajaxについて心配する必要はありません。 – Musa

答えて

1

私はちょうど(私はない元よ)thisを試してみました:

  • 小さなPDFのみありますのでご注意下さい、あなたは(プラグインについて他の回答を確認することができます私はプラグインをテストしていない)。私は大規模なPDFでこれがは動作しないことを確認することができます。私は24K PDFファイル(ローカルのみのdevのボックス - 現実の世界であるためわからないどのような影響を与えるネットワークの遅延がありますことを示す)でテスト

  • はクロームポップアップで

  • をブロックされます

Homeコントローラー:

public ContentResult ReturnPdf() 
{ 
    var file = System.IO.File.ReadAllBytes(Server.MapPath("~/content/pdf/foopdf.pdf")); 
    return Content(Convert.ToBase64String(file)); 
} 

ビュー:

<div> 
    <button id="get-pdf">Download PDF</button> 
</div> 

@section scripts{ 
    <script> 
     $(function() { 

      $("#get-pdf").click(function() { 

       $.get("@Url.Action("ReturnPdf", "Home")").success(function (d) { 
        window.open("data:application/pdf;base64," + d); 
       }) 

      }); 

     }); 
    </script> 
} 

第H ...

0

お使いのコントローラがこれらのようにする必要があり、

public FileResult GetReport(string Path) 
{ 
     try 
     { 
      if (!string.IsNullOrEmpty(Path)) 
      { 
       var file = new FileInfo(Path); 
       if (file.Exists) 
       { 
        return new FilePathResult(Path, "application/pdf"); 
       } 
      } 

      //file is empty, so return null 
      return null; 
     } 
     catch (Exception ex) 
     { 
      Utility.LogError(ex); 
      throw; 
     } 
    } 

は、ここで私は、引数としてパスを渡されていますが、idList、または任意の文字列を渡すことができます。

$.ajax({ 
      url: "@Url.Content("~/Reports/GetReport")", 
      type: "Post", 
      data: {"Path":"\\F:MyPDF.pdf"} 
      beforeSend: function() { }, 
      success: function (result) { 
       if (result.IsSuccess == false) { 
        alert(result.ErrorMessage) 
       } 
       else { 
        $('#divAlert').html('') 
        $('#divAlert').append(result) 
       } 
      } 
     }) 
     return false; 

それは、これらのコードは私の最後で正常に動作し、ちょうどあなたのデモのために

ですが、あなたが任意のクエリを持っている場合は、それをコメント。

関連する問題