AJAX调用控制器后显示PDF
我试图显示一个成功的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时现在曾两次提出过相同的文章。那不是我所追求的。
我最终什么事有在这种情况下需要做的就是将文件保存到磁盘,并在上一个成功的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);
}
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.');
}
});
下载得到的PDF这看起来很有希望。几个问题:有没有办法做到这一点,而不必保存它?对于Server.MapPath,是否是对MS.SQLServer的引用?对于返回的Json,这个引用是什么? –
Server.mapPath是Asp.net –
的一部分,如果您的问题已解决,请将答案标记为已接受,并将其解决 –
你想下载或显示它?什么是printViewer窗口? –
@teovankot我想展示它。 PrintViewer只是一个不同的窗口,可自动为用户提供打印对话框。 –
那么我只能说不要用AJAX下载文件。这真的很棘手,所以最好用旧的方式。欲了解更多信息[检查此](https://*.com/q/4545311/1849444)。 –