我在PHP代码中调用了一个jquery ajax请求。此代码从数据库中获取数据并导出到excel文件中。一旦ajax请求成功,我将获得excel文件弹出下载框。此功能在所有浏览器中都能正常运行。
现在,问题是当jquery请求花费更多时间(7-8分钟)时,在服务器上创建了excel文件,但是没有弹出下载框,30分钟后我收到超时错误。
可能是什么问题,文件是在7分钟内在服务器上创建的,但我没有从ajax请求得到任何响应。我也检查了ajax请求的超时设置为30分钟。
答案 0 :(得分:1)
即使您设法解决超时问题,让您的客户等待7到8分钟而没有任何进度反馈也远非理想。更好的方法是启动服务器上的导出并立即返回。一旦返回,您可以给出一条“正在导出...”或其他内容的进度消息。然后,您可以进行AJAX调用,定期检查导出状态并返回相应的状态消息。导出完成后,您可以将进度反馈更改为“导出完成:下载文件”,下载文件是指向服务器上创建的Excel文件的链接。您也可以通过代码触发该链接的点击以自动开始下载。
即
假设您的DIV具有显示导出状态的班级状态
首次启动导出的AJAX调用:
$.post({
url: '/export/',
...
success: function(data) {
$('.status').html('Export in progress. Please wait...');
}
});
第二次AJAX调用以轮询导出进度
$.post({
url: '/exportstatus/',
...
success: function(data) {
if(data=='OK') {
$('.status').html('Export complete: <a class="exportedfile" href="/path/to/exported/file">Download File</a>');
setTimeout(function() {
$('.status').find('a').click(); // trigger autostart of download
}, 1000);
}
}
});
答案 1 :(得分:0)
你做错了:你不想强迫用户最多停留在页面上超过几秒钟,以便从你的应用程序获得服务。
相反,使用一个小部件来定期查询状态页面(当然是ajax)并在作业完成时显示一条消息。
(什么样的excel文件需要7分钟生成?数据库转储?)
编辑:
不同的浏览器在长ajax请求时的行为会有所不同,因此即使用户愿意,也不要依赖它们永远等待。如果您要求生成报告并下载报告,您的应用程序将更加强大。
这可以让你知道我在说什么:
create_my_excel_file.php:
$_SESSION['excel_status']='generating';
create_the_excel_file();
$_SESSION['excel_status']='finished';
check_status.php:
echo $_SESSION['excel_status'];
user_interface.php:
<script type="text/javascript">
function initiateRequest(){
$.ajax('create_my_excel_file.php');
setInterval('checkForCompletion()', 5000);
}
function checkForCompletion(){
$.get('check_status.php', function(data){
if('finished'==data){
alert('Completed! Download the file now.');
location.href='file_download.php';
}
});
}
</script>
<a href="javascript:initiateRequest();">Generate the file</a>