2017-05-25 46 views
-1

我试图显示一个成功的AJAX调用后,我的控制器的PDF。我需要修改原来的方式,以便能够处理多个PDF以返回单个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"); 
} 

我试图做的第一件事就是把整个事情变成一个大字符串,但它是开始只有几个PDF文件太长了。我知道控制器正在返回一个可靠的PDF,但我似乎无法将其显示在printViewer窗口中。

在此先感谢!

编辑:

我不是试图下载文件。我只是希望在新窗口中打开它,以便用户可以打印它。有人在开发人员尝试下载PDF时现在曾两次提出过相同的文章。那不是我所追求的。

+0

你想下载或显示它?什么是printViewer窗口? –

+0

@teovankot我想展示它。 PrintViewer只是一个不同的窗口,可自动为用户提供打印对话框。 –

+0

那么我只能说不要用AJAX下载文件。这真的很棘手,所以最好用旧的方式。欲了解更多信息[检查此](https://stackoverflow.com/q/4545311/1849444)。 –

回答

0

我最终什么事有在这种情况下需要做的就是将文件保存到磁盘,并在上一个成功的AJAX调用,然后我会去抓住从光盘上的PDF并显示,小心再之后从磁盘删除PDF。我根本不想保存它,但我没有看到另一种方式。

我来这个解决方案的原因是,新窗口实际上打开之前,它是要控制器来获取图像,但是当我做了ajax调用,然后试图打开它在一个新的窗口,它wouldn打得不错,这导致了另一个电话到服务器。

$.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.'); 
    } 
}); 

而且在从服务呼叫接收PDF中的控制器(执行下来后,我创建的MemoryStream):

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

在新的控制器,以抓住并从磁盘返回的PDF:

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

Inn的控制器的字节数组(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

的一部分,如果您的问题已解决,请将答案标记为已接受,并将其解决 –