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

利用 iframe解决ajax的跨域问题

如何根据 iframe 中 AJAX 调用的完成来运行函数

如何将视图中的数组传递给 ajax 并在 Laravel 5 的控制器中访问?

停用的用户重定向到从 ajax 请求登录

jquery ajax 传递 2 个数组,然后将它们拆分并在 laravel 中分别使用