从Ajax下载返回的PDF

时间:2018-06-07 08:59:55

标签: javascript ajax asp.net-mvc

我有以下操作返回PDF:

raise SystemExit

(忽略FileStream,仅用于测试)
结果基本上是PDF本身,但它没有下载,我如何下载输出PDF?我应该还给别的东西吗?我尝试使用FileResult,但它的情况基本相同。

这就是我目前正在阅读"该文件通过Ajax:

[HttpPost]
    public string GetPDF(string data, float scaleFactor)
    {
        var result = JArray.Parse(data);
        using (var fs = new FileStream(@"c:\pdf\pdftest.pdf", FileMode.Create))
        {
            MemoryStream ms = (MemoryStream)PdfMaker.CreatePDF(scaleFactor, result, dt);
            ms.WriteTo(fs);
            return Convert.ToBase64String(ms.ToArray());
        }
    }

感谢。

编辑:

使用Stephen Muecke提供的this帖子中的解决方案

1 个答案:

答案 0 :(得分:2)

通过ajax下载文件不起作用,因为数据最终在JS对象的内存中,而不是在用户的设备上。最终,您需要使用普通的HTTP请求并返回FileResult。

但是在您的情况下,您还需要首先上传一些需要在下载之前添加到PDF中的数据。这很尴尬,因为下载必须是在单独窗口中触发的GET请求(因为您之后需要应用程序保留在同一页面上)并且在查询字符串上提供该数据不太可行。

解决这个问题的方法是分两个步骤:

1)在浏览器中,通过AJAX将数据上传到" EditPDF"行动方法。在操作方法中,使用新数据编辑PDF并保存。然后向客户端返回某种唯一ID,以识别正确的PDF。

2)当浏览器收到EditPDF方法的响应时,它会抓取返回的ID,并对" GetPDF"进行新的window.open调用。动作的URL。此操作接受PDF ID作为查询字符串参数,因此在发出请求时很容易将其包含在URL中。此操作在服务器上找到正确的文档,并在FileResult中返回它。浏览器将下载文档,同时不影响正在浏览的HTML页面。