下载文件而不将其通过AJAX调用保存到网络服务器

时间:2019-03-10 09:43:32

标签: php jquery ajax

我正在使用ajax提交表单,提交表单后,我需要下载服务器端使用php库mpdf生成的pdf文件。我不想将pdf文件保存在服务器中,因为在用户下载后不再需要该文件。我在Google上搜索过,有人建议使用Blob对象。我还返回了一个json响应以显示给用户。有人可以解释一下是否可行以及如何实现吗?非常感谢

这是我的JavaScript代码:

              $.ajax({

                    type: form.method,
                    data: $(form).serialize(),
                    dataType: 'JSON',

                    beforeSend: function() {
                        // Show loader
                        $(".loader").show();
                    },


                    success: function(response) {

                        // Hide loader
                        $(".loader").hide();


                        if (response.error_code == '200') {

                            // Add class alert danger to the message
                            $('.alert', $('.horizontal-form')).addClass('alert-success').show();
                            // Show error message
                            $('#error_message').html(response.error_message);
                            // Remove default validation error message from template
                            $('#error_message').get(0).nextSibling.remove();
                            // Remove class alert danger if was left by previous validation
                            $('.alert', $('.horizontal-form')).removeClass('alert-danger');
                            // reset form fields
                            form.reset();
                            // Scroll back to show success message
                            scrollTo(success, -200);

                        }

                    }

                });

这是我的php代码

if(isset($_POST['userLetter'])){

                        header("Content-Type", "application/pdf");

                        // Render the view using twig and pass params to it
                        $html=$twig->render('/km-letters/km-letter-new-user.twig', array(
                            // Render user details on twig topbar
                            'prova' => 'pippo'

                        ));

                        $mpdf->WriteHTML($html);


                        return $mpdf->Output('foobar-' . time() . '.pdf','D');


                    }

从响应中我也得到以下标题,并且可以看到pdf文件:

缓存控制
公共,必须重新验证,最大年龄= 0 连接
活着 内容描述 文件传输 内容配置 附件; filename =“ doc.pdf” 内容传输编码
二元 内容类型
应用/ pdf 日期
太阳,2019年3月10日11:11:35 GMT 过期 1997年7月26日,星期六,格林尼治标准时间 保持生命
超时= 5,最大= 99 最后修改
太阳,2019年3月10日11:11:35 GMT 语气
上市 服务器
阿帕奇 传输编码
大块 X生成器 mPDF 7.1.9 X-Powered-By
PHP / 7.3.0

但是我也得到以下很长的字符串响应:

XHRPOSThttp://router.kondomatica.me/km-users/createUser# [HTTP / 1.1 200 OK 332ms] HeaderCookieParametriRispostaTempiAnalisi dello stackPayload rispostax1JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKLKlJQQ9494>

1 个答案:

答案 0 :(得分:0)

根据问题的评论,这是一个未经测试的解决方案,应该可以使用。

由于安全原因,javascript无法保存文件,因此代码首先从响应中创建一个Blob对象,然后是一个指向Blob的对象URL的锚点。然后将锚添加到DOM,然后“单击”,然后从DOM中删除。

$.ajax({
    type: form.method,
    data: $(form).serialize(),
    cache: false,

    beforeSend: function() {
        // Show loader
        $(".loader").show();
    },

    success: function(response, responseCode, xhr) {
        // Hide loader
        $(".loader").hide();

        if (responseCode == "200") {
            var disposition = xhr.getResponseHeader('content-disposition');
            var matches = /"([^"]*)"/.exec(disposition);
            var filename = (matches != null && matches[1] ? matches[1] : 'doc.pdf');
            var blob = new Blob(response, {
                type: 'application/pdf'
            });
            var link = document.createElement('a');

            link.href = window.URL.createObjectURL(blob);
            link.download = filename;

            document.body.appendChild(link);
            link.click();
            document.body.removeChild(link);

            // Add class alert danger to the message
            $(".alert", $(".horizontal-form"))
            .addClass("alert-success")
            .show();
            // Show error message
            $("#error_message").html(response.error_message);
            // Remove default validation error message from template
            $("#error_message")
            .get(0)
            .nextSibling.remove();
            // Remove class alert danger if was left by previous validation
            $(".alert", $(".horizontal-form")).removeClass("alert-danger");
            // reset form fields
            form.reset();
            // Scroll back to show success message
            scrollTo(success, -200);
        }
    }
});