当前位置: 首页 > 知识库问答 >
问题:

从AJAX调用下载文件而不保存到webserver

钮晟
2023-03-14

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

              $.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);

                        }

                    }

                });
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');


                    }

cache-control
public,必须重新验证,max-age=0连接
Keep-Alive内容-描述文件传输内容-处置附件;filename=“doc.pdf”内容-传输-编码
二进制内容-类型
应用程序/PDF日期
Sun,2019年3月10日11:11:35 GMT过期时间,1997年7月26日05:00:00 GMT保持-活动
时间=5,max=99最后修改
Sun,2019年3月10日11:11:35 GMT杂注
公共服务器
Apache传输-编码
分块x-生成器mPDF 7.1.9 x-power-by
PHP/7.3.0

但我也得到以下非常长的字符串响应:

xhrposthttp://router.kondomatica.me/km-users/createuser#[HTTP/1.1 200 OK 332ms]HeaderCookieParametriRispostaTempiAnalisi dello stackPayload rispostax1JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL01lZGlhQm94IFswIDAgNTk1LjI4MCA4NDEuODkwXQo

共有1个答案

慎望
2023-03-14

基于这个问题的评论,这里有一个未经测试的解决方案,应该有效。

由于安全原因,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);
        }
    }
});
 类似资料:
  • 问题内容: 我正在编写一个应用程序,该应用程序从url下载图像,然后使用aws-sdk将其上传到S3存储桶。 以前,我只是下载图像并将其保存到磁盘中,就像这样。 然后像这样将图像上传到AWS S3 但是我想跳过将图像保存到磁盘的部分。有什么办法可以让我对一个变量进行响应,然后将其上传? 问题答案: 这是一些可以很好地做到这一点的javascript:

  • 问题内容: 我尝试使用以下代码下载pdf文件。它存储在应用程序数据中。但是我需要在iPhone的 “文件” 文件夹中显示下载的pdf 。 可能吗?? 问题答案: 这是下载任何文件并保存到“照片”(如果是图像文件)或“文件”(如果是pdf)的方法

  • 问题内容: 我正在使用以下脚本来启动文件下载: 当我直接打开页面时,它工作正常,但事实是,我需要从另一个页面通过Ajax调用此脚本。当我这样做时,下载就不会开始。脚本的其余部分执行了预期的工作。 我以为问题不在于无法以这种方式使用标头函数,但是肯定有一种方法可以使这项工作正常进行吗? 如果有任何帮助,这是Ajax函数: 形式如下: 问题答案: 您不能使用AJAX下载文件。这没有道理。您可以发送AJ

  • 问题内容: 我正在使用以下脚本来启动文件下载: 当我直接打开页面时,它工作正常,但事实是,我需要从另一个页面通过Ajax调用此脚本。当我这样做时,下载就不会开始。脚本的其余部分执行了预期的工作。 我认为问题不是这种方式可以使用头函数,但是肯定有一种方法可以使这项工作正常进行吗? 如果有帮助,这是Ajax函数: 形式如下: 问题答案: 您不能使用AJAX下载文件。这没有道理。您可以发送AJAX请求并

  • 我正在编写一个应用程序,它从url下载图像,然后使用AWS-SDK将其上传到S3桶中。 以前,我只是下载图像并将它们保存到磁盘上,就像这样。 然后像这样将图像上传到AWS S3 但我想跳过将映像保存到磁盘的部分。有什么方法可以响应从到一个变量,然后上传它吗?

  • 问题内容: 我有一个按钮,它将调用ajax函数。 这是我的ajax功能 我根据用户输入创建csv文件。创建之后,我希望它提示下载或强制下载(最好是强制)。我在php文件的末尾使用以下脚本来下载文件。如果我在单独的文件中运行此脚本,则可以正常运行。 但是,如果我在csv.php的末尾运行它,它会将file.csv的内容输出到页面中(进入ajaxDiv)而不是下载。 有没有办法强制在csv.php的末