Ajax 到控制器并在 IFrame 中返回文件
Posted
技术标签:
【中文标题】Ajax 到控制器并在 IFrame 中返回文件【英文标题】:Ajax to Controller and return file in a IFrame 【发布时间】:2017-06-09 16:56:31 【问题描述】:我正在尝试将byte[]
数组的内容打印到 Iframe 中,然后还让用户可以选择以 pdf 格式下载文件。
在我看来,我有一个连接到ajax
调用的按钮,它将byte[]
传递给我的actionresult,它可以工作,返回类型是FileContentResult
。
但是我不确定如何在我的ajax
响应中返回文件内容,然后将 iframe 的源设置为我从 actionresult 中返回的响应?
查看
<input type="button" value="Show PDF" />
<div id="DisplayPDF"></div>
Jquery/Ajax
$(document).ready(function ()
$('input').on('click', function ()
$.ajax(
url: '/BillPayment/GetPDF',
dataType: 'json',
type: 'POST',
data: id: '@Model.ROIAgreementApplication' , //your string data
success: function (response)
$("#DisplayPDF").html(
$('<iframe>',
src: this.href,
width: '600px',
height: "800px"
)
);
);
);
);
动作结果/控制器
[HttpPost]
public ActionResult GetPDF(string id)
MemoryStream outputStream = new MemoryStream();
MemoryStream workStream = new MemoryStream();
var bytes = System.Text.Encoding.UTF8.GetBytes(id);
byte[] byteArray = bytes;
outputStream.Write(byteArray, 0, byteArray.Length);
outputStream.Position = 0;
return File(outputStream, "application/pdf");
之前我想在这样的给定 Iframe 的源属性中使用 @Url.Action()
<iframe src='@Url.Action("GetPDF","BillPayment", new id = @Model.ROIAgreementApplication )' frameborder="0" />
但是它甚至没有传递给我的操作结果?
有什么建议吗?
【问题讨论】:
【参考方案1】:我认为您正在尝试读取预先存在的 PDF 文件并将输出流发送到浏览器。这里的一些注意事项: - 您需要设置完整的 HTTP 标头,因为您缺少参数光长度等。 - 标签 application/force-download 可能你感兴趣,因为使用 application/pdf 会导致文件在浏览器中使用 PDF 阅读器打开,而第一个会要求用户下载文件。
我认为不可能在 src="" 字段中执行任何 javascript 查询。事实上,我认为没有必要为此使用任何 iframe。创建一个 A 对象并从该对象调用 URL 就可以完成这项工作。或者更简单:更改当前页面的 URL:
window.location.href="path_to_pdf";
顺便说一下,这段代码:
$('input').on('click', function ()
使用 id="input" 引用按钮,但在您的 HTML 代码中不存在该对象。应该是这样的:
<input type="button" id="input" value="Show PDF" />
根据要求,这是一个示例:
CTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
$(document).ready(function ()
$('input').on('click', function ()
window.location.href = "http://www.panoramanumismatico.net/articulos/download.php?fid=3324";
);
);
</script>
</head>
<body>
<input id="input" type="button" value="Show PDF" />
</body>
</html>
不要在 JSfiddle 中测试它,因为它不允许执行外部查询。
在 C# 方面,看看这个: https://sourcefirst.wordpress.com/2007/11/20/c-force-file-download/
【讨论】:
嗨,Carles,你能举个例子吗? 一个例子到底是什么?顺便说一句,您的代码中有一个错误,因为没有 ID 为“input”的对象以上是关于Ajax 到控制器并在 IFrame 中返回文件的主要内容,如果未能解决你的问题,请参考以下文章
ajax 调用在我的 facebook iframe 中返回 null