【问题标题】:Open FileStreamResult by ajax (as downloaded file)通过 ajax 打开 FileStreamResult(作为下载的文件)
【发布时间】:2016-05-27 15:37:45
【问题描述】:

是否可以使用 ajax 调用将 FileStreamResult 作为下载文件打开?

控制器方法

public FileStreamResult DownloadPDF()
{
        var stream = myHandler.getFileStream("myfile.pdf");
        return File(stream, "application/pdf", "myfile.pdf"));
}

HTML代码

<a href="#" class="mydownload">Click Me</a>
<script type="text/javascript>
    $("a.mydownload").click(function () {
        $.ajax({
            method: 'GET',
            url: 'http://myserver/file/DownloadPDF',
            success: function (data, status, jqXHR) {
                var blob = new Blob([data], { type: "application/pdf" })
                var url = window.URL.createObjectURL(blob);
                var a = document.createElement("a");
                document.body.appendChild(a);
                a.href = url;
                a.click();

            }
        });
    });
</script>

在 IE 上运行我被拒绝访问,但在 Chrome 上运行正常。但是,我确实得到了“空白”/无效的 pdf。

【问题讨论】:

    标签: javascript asp.net-mvc


    【解决方案1】:

    使用XMLHttpRequest() 并将responseType 设置为"blob",将download 属性添加到&lt;a&gt; 元素

    $("a.mydownload").click(function () {
        var request = new XMLHttpRequest();
            request.responseType = "blob";
            request.open("GET", "http://myserver/file/DownloadPDF");
            request.onload = function() {
                var url = window.URL.createObjectURL(this.response);
                var a = document.createElement("a");
                document.body.appendChild(a);
                a.href = url;
                a.download = this.response.name || "download-" + $.now()
                a.click();
            }
            request.send();
    });
    

    或者,您可以使用jquery-ajax-blob-arraybuffer.js。另见Add support for HTML5 XHR v2 with responseType set to 'arraybuffer' on $.ajax

    【讨论】:

    • 这在 Chrome 上效果很好,但在 IE 中我在 a.click() 上被拒绝访问
    • IE11。我首先在 request.responseType="blob" 上遇到了 InvalidStateError,但是在 request.open 之后移动该行解决了这个问题。您可能需要相应地更新您的代码。现在是我正在努力解决的 a.click() 访问被拒绝问题
    • IE11好像不支持下载方式
    【解决方案2】:

    IE11 仍然存在问题,但对 @guest271314 解决方案的微小更改似乎可以解决问题。

    1. 打开后设置responseType。
    2. 在 IE 上使用 msSaveBlob

    $("a.mydownload").click(function() {
      var request = new XMLHttpRequest();
      request.open("GET", "http://myserver/file/DownloadPDF");
      request.responseType = "blob";
      request.onload = function() {
        var msie = window.navigator.userAgent.indexOf("MSIE");
        if (msie > 0) {
          window.navigator.msSaveBlob(this.response, "myfile.pdf");
        } else {
          var url = window.URL.createObjectURL(this.response);
          var a = document.createElement("a");
          document.body.appendChild(a);
          a.href = url;
          a.download = this.response.name || "download-" + $.now()
          a.click();
        }
      }
      request.send();
    });
    

    【讨论】:

    • 这适用于开发环境。在生产中,每当我尝试打开 pdf 文档时,都会出现“加载文档失败”错误。请问我该如何解决这个问题?
    猜你喜欢
    • 2019-09-09
    • 2016-07-08
    • 2014-12-23
    • 2014-09-07
    • 2016-04-20
    • 2019-11-13
    • 2023-03-16
    • 2013-05-16
    • 1970-01-01
    相关资源
    最近更新 更多