0

我目前正在尝试解决以下问题:

        var fileName = "monthly_report.pdf"
        var document = new Document();
        //DO SOME STUFF WITH THE DOCUMENT

        MemoryStream stream = new MemoryStream();
        doc.Save(stream, SaveFormat.Pdf);
        byte[] bytes = stream.GetBuffer();
        Response.Clear();
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment; filename="+fileName);
        Response.BinaryWrite(bytes);
        Response.End();

基于此代码,我正在尝试显示 Aspose。Words 文档在浏览器中转换为 pdf / 尝试在浏览器中为所述文档创建下载对话框。

当我执行该操作时,没有错误消息。pdf 的内容随后会显示在 chrome 调试器的响应消息中。响应还具有适当的大小(pdf 为 60kb)。它根本不会开始下载或在浏览器中显示 pdf,我想知道为什么会这样。

我还尝试了 Aspose 提供的替代方案:

        var resp = System.Web.HttpContext.Current.Response;
        resp.Clear();
        // Create Memory Stream Object
        MemoryStream stream = new MemoryStream();
        doc.Save(stream, SaveFormat.Pdf);
        doc.Save(resp, fileName, ContentDisposition.Attachment,                                SaveOptions.CreateSaveOptions(
        SaveFormat.Pdf));
        resp.End();

这导致在响应中显示 pdf 而不是浏览器本身的结果完全相同。

执行此代码的控制器操作由 ajax 语句调用:

$("#btnReport").click(function () {

            var datum = $("#hiddenDatum").val();

            $.ajax({
                type: "GET",
                url: '@Url.Action("GenerateMonthlyReport", "Reporting")',
                data: { datum: datum},
                success: function (data) {

                }
            });
        });

对我做错的任何建议将不胜感激。

编辑:我的研究表明 ajax 调用确实不起作用。如何根据我的控制器逻辑启动文件下载?

4

1 回答 1

0

您不能使用 AJAX 调用直接下载文件。你可以这样做:

$.ajax({
   type: "GET",
   url: '@Url.Action("GenerateMonthlyReport", "Reporting")',
   data: { datum: datum},
   success: function (data) {
      window.location.href = data.filePath; // i.e. '/downloads/file.pdf';
   }
});

您不能将数据流回 jQuery 处理程序。为什么不使用标准的 HTML 锚点将其作为一个简单的 get 请求呢?

@Html.ActionLink("Generate Monthly Report", "GenerateMonthlyReport", "Reporting", new { datum = DateTime.Now.ToString("d", new CultureInfo("en-US")})
于 2014-02-17T16:27:24.130 回答