我必须以excel格式导出大文件并下载它。 我正在使用PHP Excel。文件非常大,因此导出需要很长时间。所以我正在使用异步 ajax 调用,而在服务器端,我正在使用 session_write_close。通过这个我可以发送并发呼叫,如果我保持在同一页面上,这是可以正常工作的......但是当我发送 ajax 调用以导出和下载文件,然后我在完成该 ajax 调用之前重定向到一个新页面时,该 ajax 调用被取消并且无法下载文件。如何导出文件,然后在用户被重定向到新 URL 后下载它。
有几种方法可以在同一页面上执行下载操作。使用异步可能会导致问题,您的应用程序可能会在 ajax 操作之间感到滞后。
根据我的意见,您可以通过这种方式执行ajax请求。
创建文件时,如果可能,请使用命令行方法。或者,您可以简单地将系统命令与 curl 或 elinks 命令一起使用,并传递用于生成 excel 文件的 url。
curl http://mysite/generate/excel?id=123
或
elinks http://mysite/generate/excel?id=123
通过使用 ajax ( sync (,您可以使用保持活动选项发出请求,并在代码中检查文件是否以一定的间隔创建。 你的代码将是这样的
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的响应,成功时调用下面的函数,文件网址通过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)
}
这是在生成大文件需要很长时间时如何下载大文件的逻辑流程。