c#
  • jquery
  • ajax
  • pdf
  • 2017-05-25 5 views -1 likes 
    -1

    コントローラへのAJAXコールの成功後にPDFを表示しようとしています。 1つ返すために複数のPDFを処理できるように、元のやり方を変更する必要がありました。コントローラへのAJAXコール後のPDFの表示

    古い方法:

    var uri = '../api/Controller/' + string1 + "," + string2 + "," + string3; 
    var src = '../web/printViewer.html?file=' + encodeURIComponent(uri); 
    window.open(src, "_blank"); 
    

    だから私はこのようになりますAJAX呼び出しでその機能を維持しようとしている:

    $.ajax({ 
        type: 'get', 
        url: '../api/Controller', 
        contentType: 'application/json; charset=utf-8', 
        data: { thing1: item, thing2: item2 }, 
        datatype: 'json', 
        success: function (result) { 
         // no bueno D: 
         // but I get back a proper PDF every time 
        }, 
        error: function() { 
         toastr.error('Error creating print.'); 
        } 
    }); 
    

    とC#のコントローラの

    [HttpGet] 
    public HttpResponseMessage Get(string thing1, string thing2) //thing2 will be a string[] eventually, once I am able to get 2-3 pdfs working 
    { 
        byte[] data = response.PDFBytes[0] == null ? new byte[0] : response.PDFBytes[0]; 
        int length = response.PDFBytes[0] == null ? 0 : response.PDFBytes[0].Length; 
    
        var stream = new MemoryStream(data, 0, length, true, true); 
    
        result.Content = new ByteArrayContent(stream.GetBuffer()); 
    
        result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") 
        { 
         FileName = "CheckedOutItems.pdf" 
        }; 
    
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
    } 
    

    私がやろうとしたことは、全体を1つの大きな文字列に変えることでしたが、いくつかのPDFだけではあまりにも長いです。私はコントローラが固体のPDFを返すことを知っていますが、printViewerウィンドウに表示できないようです。

    ありがとうございます!

    編集:

    私はこのファイルをダウンロードしようとしていません。私はちょうど新しいウィンドウでそれを開いて、ユーザーがそれを印刷できるようにしたい。開発者がPDFをダウンロードしようとしているところで、今度は同じ記事を2回お勧めしています。それは私が後になったことではありません。

    +0

    ダウンロードして表示するだけですか? printViewerウィンドウとは何ですか? –

    +0

    @teovankot私はそれを示したいと思います。 PrintViewerは、ユーザーの印刷ダイアログを自動的にプルアップする別のウィンドウです。 –

    +0

    それでは、私はAJAXでファイルをダウンロードしないでください。それは本当に難しいことですので、古い方法を使用する方が良いです。詳細については[こちらをチェック](https://stackoverflow.com/q/4545311/1849444)を参照してください。 –

    答えて

    0

    このシナリオでやっていたのは、ファイルをディスクに保存することでした.AJAXの呼び出しでは、PDFからディスクを取り出して表示します後でPDFをディスクから削除してください。私はそれをまったく保存したくなかったが、私は別の方法を見なかった。

    私がこの解決策に来たのは、イメージを取得する前に新しいウィンドウが実際に開いていたからです。しかし、私がAjaxコールをしたときに、新しいウィンドウでそれを開こうとしたとき、それでは、サーバーをもう一度呼び出すという結果になりました。

    $.ajax({ 
        type: 'get', 
        url: '../api/Controller', 
        contentType: 'application/json; charset=utf-8', 
        data: { thing1: item, thing2: item2 }, 
        datatype: 'json', 
        success: function (result) { 
         var uri = '../api/GetPDFOffDisk/ + pdfName; 
         var src = '../web/printViewer.html?file=' + encodeURIComponent(uri); 
         window.open(src, "_blank"); 
        }, 
        error: function() { 
         toastr.error('Error creating print.'); 
        } 
    }); 
    

    サービスコール(私はMemoryStreamを作成後ダウン実装)からPDFを受け取ったコントローラで:ディスクからPDFを取得し、返すために、新しいコントローラでは

    using (Filestream fs = new File.OpenWrite(_path)) 
    { 
        stream.WriteTo(fs); 
        file.Dispose(); 
    } 
    

    if (File.Exists(_path)) 
    { 
        using (FileStream file = System.IO.File.OpenRead(_path)) 
        { 
         var data = File.ReadAllBytes(_path); 
         int length = data.Length; 
         MemoryStream ms = new MemoryStream(data, 0, length, true, true); 
         result.Content = new ByteArrayContent(ms.GetBuffer()); 
         result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") 
         { 
          FileName = id + ".pdf" 
         }; 
         result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
    
         file.Dispose(); 
        } 
        File.Delete(_path); 
    } 
    
    0

    旅館、あなたのコントローラは、一時ファイルへのあなたのバイト配列(pdfファイルのバイト)を保存し、あなたのコントローラが一時ファイルのリンクを返し、別のタブ

    [HttpGet] 
    public HttpResponseMessage Get(string thing1, string thing2) //thing2 will be a string[] eventually, once I am able to get 2-3 pdfs working 
    { 
        byte[] data = response.PDFBytes[0] == null ? new byte[0] : response.PDFBytes[0]; 
        int length = response.PDFBytes[0] == null ? 0 : response.PDFBytes[0].Length; 
    
        var stream = new MemoryStream(data, 0, length, true, true); 
    
        result.Content = new ByteArrayContent(stream.GetBuffer()); 
    
        result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") 
        { 
         FileName = "CheckedOutItems.pdf" 
        }; 
        string TempPath="~/YourFileTempPath.pdf"; 
        using (FileStream file = new FileStream(Server.MapPath(TempPath), FileMode.Create, FileAccess.Write)) { 
        stream.WriteTo(file); 
    
    
        return Json(TempPath,JsonBehavior.AllowGet); 
    } 
    

    とあなたのJSコード内で開き作る

    $.ajax({ 
        type: 'get', 
        url: '../api/Controller', 
        contentType: 'application/json; charset=utf-8', 
        data: { thing1: item, thing2: item2 }, 
        datatype: 'json', 
        success: function (result) { 
         window.location.href=result; 
        }, 
        error: function() { 
         toastr.error('Error creating print.'); 
        } 
    }); 
    
    +0

    から結果のPDFをダウンロードしたくないので、そのスレッドで提案された回答は私を助けません。いくつかの質問:これを保存せずに行う方法はありますか? Server.MapPathについては、それはMS.SQLServerへの参照ですか?リターンJsonについては、その参照は何ですか? –

    +0

    Server.mapPathがAsp.net –

    +0

    の一部であり、問​​題が解決された場合は、回答が受け入れられ、upvoteになります。 –

    関連する問題