您能否根据 ajax 响应中提交的表单数据提示下载


Can you prompt a download based on form submitted data within an ajax response?

我使用 AJAX POST 将表单数据发送到外部脚本,并尝试在提交时隐藏表单并提示用户下载脚本。

脚本本身运行良好(使用 fpdf 输出 pdf 文件以供下载)。出于某种原因,提示用户下载虽然永远不会通过。

我的 Ajax 请求目前是:

        $.ajax({
            url: "file.php",
            type: "POST",
            data: data,
            cache: false,
            success: function (html) {
                //hide the form
                $('#form').fadeOut('slow');
                //display results
                $('#form_results').fadeIn('slow');
                $("#form_results").html(html);
            }       
        });

文件.php(单独)将使用 FPDF 生成并显示 PDF。通过将输出设置为 I,文档将输出到浏览器,设置为 "D",如果我只是直接访问文件.php它通常会强制下载。

有什么想法吗?

不幸的是,

你不能直接从ajax调用强制下载。最好的办法是通过 ajax 提交表单,并让 ajax 使用一个 url 进行响应,您可以将用户重定向到该 url 以开始下载。但是,仅供参考,使用 location.href 到发送标题以强制下载在 IE 中的页面将导致黄色安全栏出现在页面顶部。这发生在IE8中,不确定其他版本。FF和Chrome没有问题。

编辑:

只是想补充一点,当您将某人重定向到强制下载的页面时,他们实际上并没有离开他们当前所在的页面。因此,他们不必重新加载ajax页面或任何东西。下载对话框将显示。因此,如果您在索引上.php并且您说 location.href='download.php' 并下载.php强制下载。您只需获得下载对话框,不要离开索引.php。

编辑2:

实际上已经有很多关于这个问题的问题。

https://stackoverflow.com/search?q=force+download+over+ajax

问题是你试图显示结果,但它是形式上的,这是隐藏的。尝试类似以下内容:

            //hide the form
            $('#form').children().fadeOut('slow');
            //display results
            $('#form results').fadeIn('slow');
            $("#form results").html(html);

这样,每个孩子都会被隐藏起来,但父母本身不会。