【问题标题】:how to export and then download a excel file with ajax call in background in php如何在php的后台使用ajax调用导出然后下载excel文件
【发布时间】:2017-06-09 09:26:56
【问题描述】:

我必须以 excel 格式导出大文件并下载。我正在使用 php excel。文件非常大,因此 导出 需要很长时间。所以我使用异步 ajax 调用,在服务器端,我使用 session_write_close。通过这个我可以发送并发呼叫。如果我留在同一页面上,这工作正常...... 但是当我将 ajax 调用发送到 export and download 文件,然后我在该 ajax 调用完成之前重定向到一个新页面时,该 ajax 调用被取消并且无法下载文件。即使在用户被重定向到新 URL 后,我如何导出文件然后下载它。

【问题讨论】:

  • 不查看您的代码?在新窗口中打开 ajax 调用,或等待调用结束后再重定向到新页面。
  • 内容处置:在您的文件中
  • 以下是负责生成调用的代码。 getReportData: function () { $.ajax({ type: 'POST', async: true, url: url, dataType: "json", data: data}) .done(function (data) { var $a = $("<a>"); $a.attr("href", data.file); $("body").append($a); $a.attr("download", data.name); $a[0].click(); $a.remove(); }); }

标签: php excel file download export


【解决方案1】:

有几种方法可以在同一页面上执行下载操作。使用 async 可能会导致问题,您的应用程序可能会在 ajax 操作之间感到滞后。

根据我的意见,您可以通过这种方式执行您的 ajax 请求。

如果可能,在创建文件时使用命令行方法。或者您可以简单地使用带有 curl 或 elinks 命令的系统命令,并传递用于生成 excel 文件的 url。

curl http://mysite/generate/excel?id=123

elinks http://mysite/generate/excel?id=123

通过使用 ajax (sync),您可以使用 keep alive 选项发出请求,并检查您的代码内部是否以一定间隔创建文件。你的代码会是这样的

while (!file_exists("path/to/excel_file.xlsx")) {

   usleep(2000);
}

echo json_encode(["status" => true, "file_url" => "http://mysite/url/to/excel_file.xlsx"]);

一旦你从 ajax 得到响应,在成功函数调用下面的函数和文件 url 以通过同一页面上的 iframe 下载文件。

downloadAttachment(response.file_url)

/* Amazing download management with error handling */

var downloadAttachment = function(link){

    var iframe = document.createElement("iframe"), iframeWindow;

    iframe.src = link;

    document.body.appendChild(iframe);

    iframe.onload = function(){

        response = JSON.parse($(iframe).contents().text())

        if(!response.status)
        {
            alert(response.message);
            $(iframe).remove();
        }
    }

    setTimeout(function(){

        $(iframe).remove();

    },10000)
}

如果生成需要很长时间,这是如何下载大文件的逻辑流程。

【讨论】:

  • 亲爱的 Pratik,感谢您的回复,但实际上下载并不需要时间,而 生成 excel 文件需要时间,在此期间如果客户端重定向到其他页面然后即使文件生成完成,调用也会中止并且文件不会被下载。
  • @Muhammad,是的,这正是我想要解释的。您可能需要在重定向时发出警报。 window.onbeforeunload 或者您必须通过套接字或任何其他方式实现,例如每当加载页面时,您需要检查该用户的文件是否存在并执行一些操作以下载文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多