我在PHP代码中调用了一个jquery ajax请求。这段代码从数据库获取数据并导出到excel文件中。一旦ajax请求将成功,我将得到excel文件弹出下载框。此功能在所有浏览器中都工作得很好。
现在,问题是当jquery请求花费更多的时间(7-8分钟),在服务器上创建了excel文件,但下载框没有弹出,30分钟后我收到超时错误。
可能是什么问题,文件在7分钟内在服务器上创建,但我没有从ajax请求中得到任何响应。我还检查了ajax请求的超时时间,设置为30分钟。
发布于 2012-01-10 14:37:12
即使你设法解决了超时,让你的客户等待7到8分钟而没有任何进度反馈也是很不理想的。更好的方法是在服务器上启动导出并立即返回。一旦返回,您就可以给出一条进度消息,上面写着“正在导出..”或者别的什么。然后,您可以使用AJAX调用定期检查导出的状态并返回相应的状态消息。导出完成后,您可以将进度反馈更改为“Export complete: Download file”,并将下载文件作为指向服务器上创建的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);
}
}
});
发布于 2012-01-10 14:07:12
你做错了:你不想为了从你的应用程序中获得服务而强迫用户在页面上停留最多几秒钟。
相反,您可以使用一个小部件,它将定期查询状态页面(当然是使用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>
https://stackoverflow.com/questions/8799193
复制相似问题