【问题标题】:return PDF in ajax request在 ajax 请求中返回 PDF
【发布时间】:2012-04-11 11:08:24
【问题描述】:

我有一个 ajax 请求到我正在创建 PDF 文件的服务器。现在我想在新窗口/标签中显示这个文件或者只是下载它。我该怎么做?

我的请求

$.ajax({
    url: '/Document/CreatePDF',
    type: 'POST',
    data: {
        docid: documentId,
        dataId: array
    },
    traditional: true,
    success: function (data) {
    }
});

    [HttpPost]
    public FileStreamResult CreatePDF(long docid, List<long> dataId)
    {
        var document = _rep.LoadDocument(docid.ToString(), Server.MapPath("~/Documents/") + docid + ".xml");

        var exporter = new PDFExporter(document);

        MemoryStream fileStream = exporter.CreatePDF();
        byte[] PdfByte = fileStream.GetBuffer();
        fileStream.Flush();
        fileStream.Close();

        HttpContext.Response.AddHeader("content-disposition","attachment; filename=form.pdf");

        return new FileStreamResult(fileStream, "application/pdf");
    }

【问题讨论】:

  • 我认为您应该向服务器发送普通表单或将地址返回到创建的 pdf 文档,javascript 可以在新窗口中将浏览器转发到该地址...
  • 通用解决方案:这对我有用(通过 MVC-ajax 调用来自 byte[] 的 PDF 模式对话框)stackoverflow.com/questions/15477525/…>

标签: asp.net-mvc pdf jquery response


【解决方案1】:

您不能使用 AJAX 下载文件。这样做的原因是因为 javascript 不允许您将下载的内容保存在客户端计算机上,也不允许提示另存为对话框。您应该使用简单的 HTML &lt;form&gt; 或锚点:

@using (Html.BeginForm("CreatePDF", "Document", FormMethod.Post, new { id = "myform" }))
{
    <button type="submit">Download</button>
}

如果您需要向此控制器操作传递仅在客户端知道的参数,您可以订阅此表单的.submit 事件,然后使用相应的值动态地将隐藏字段注入其中,然后保留默认操作执行。如果这些值在服务器端是已知的,您应该简单地使用 HTML 助手来生成这些隐藏字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 2011-10-19
    • 2016-03-31
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多