[JQuery+PHP]求下载文件实现 需求:1.点击画面上的下载按钮,可以下载文件2.点击按钮时,弹出层(其他按钮不可用),显示一段文本3.弹出下载文件对话框时,弹出层自动消失(隐藏) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 大概的思路结构代码为:html:$(function(){ $("#down").click(function(){ $(document).append("<div id='tan' style='width:300px;height:150px;z-index:999'><img src='ajaxloading.gif'/>正在下载...请等候!谢谢!</div>"); $.ajax({ url:'down.php', type:'post', async:false, success:function(data){ $('#tan').hide();//返回输出就表示请求成功后自动隐藏弹出层!如果没有效果就让down.php输出任何一个隐藏字符,来达到类似效果! } }); });});<input type="button" id="down" value="下载">down.php<?phpheader("Content-Type:application/octet-stream"); //下载的mimetypeheader("Content-Disposition: attachment; filename=文件名.后缀名"); header("Pragma: no-cache"); //不 缓存header("Expires: 0");echo "你要输出的内容"; echo file_get_contents("文件名.后缀名");exit;?> To falizixun2:您给的代码效果理解是正确的,只是我使用您提供的方法时,如何弹出文本保存框呢? TO falizixun2:文件是通过PHPExcel生成的xls文件 其实你这个就是一个下载前显示一段广告,真正下载时关闭,不知道我的理解对吗你用ajax方式是没有办法进行下载的,可以在页面隐藏一个iframe,点击“下载”按钮时,弹出一个提示框,延迟5秒关闭,然后iframe的src指定下载文件,就可以有保存框了! To hnxxwyq:你的理解是对的,但是,文件是动态生成的,也许是5秒,也许是20秒,不固定,不能用延迟的方法,不知道您有什么好的方案? 这种做法,我一般会这样做1、ajax动态请求生成的文件缓存,如果已经生成完毕,关闭提示框,iframe触发下载2、没有的话,就重复请求,直到文件缓存生成完毕3、关于文件缓存的删除,一般是保留保留1-2天或者更少的时间,然后就删除了,防止盗链因为浏览器接受到不能处理的文件时,一般会提示你保存下载,这个时候,你已经不能用任何的客户端脚本进行监控浏览器发出的下载请求,也不能得知浏览器什么时候得到response信息,仅仅能把所有事情做好以后,才通知浏览器做具体的事情! 关于iframe触发下载,您能提供一下示例代码吗? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>test</title><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" /><script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script><script type="text/javascript">$(function(){ $("#down").click(function(){ $('body').append("<div id='tan' style='width:300px;height:150px;z-index:999'><img src='ajaxloading.gif'/>正在下载...请等候!谢谢!</div>"); // 处理其他事情 alert('处理其他事情'); // 隐藏提示框 $('#tan').hide(); // 触发下载 $('#idown').attr('src', 'http://download.pchome.net/internet/browser/browser/redirectsrv-141895-8.html'); });});</script></head><body><input type="button" id="down" value="下载"><iframe id="idown" style="display:none"></iframe></body></html> To hnxxwyq:感谢您的回答。我试一下 或者你可以这么做,PHP文件只负责生存XLS文件,在PHP里判断那个xls文件是否已经生成,file_exists('动态生成的XLS文件名');再把文件名给前端,这样,JS只有在XLS已经生成存在的时候才会返回数据给前端!然后在把那个框架导向另一个PHP,就像: $('#idown').attr('src', '这里可以是另一个PHP文件,包含输出头的文件,能直接下载XLS文件'); 这是一种什么情况!!! PHP古怪问题~~请留步~~ 求一个递归程序~~~~~~~~~~~~~~~~~ c 里面的这个改成PHP的? dropdown listbox phplib高手请进? 如何判断checkbox是否被选中 {88888888-8888-8888-8888-888888888888}象这样是怎么加密的?怎样解密?难道没人懂吗?? number_format,round,sprintf 动态添加表单并提交数据。 求一个字符串比较程序!!! 求一段php代码
html:$(function(){
$("#down").click(function(){
$(document).append("<div id='tan' style='width:300px;height:150px;z-index:999'><img src='ajaxloading.gif'/>正在下载...请等候!谢谢!</div>");
$.ajax({
url:'down.php',
type:'post',
async:false,
success:function(data){
$('#tan').hide();//返回输出就表示请求成功后自动隐藏弹出层!如果没有效果就让down.php输出任何一个隐藏字符,来达到类似效果!
}
});
});
});
<input type="button" id="down" value="下载">
down.php<?php
header("Content-Type:application/octet-stream"); //下载的mimetype
header("Content-Disposition: attachment; filename=文件名.后缀名");
header("Pragma: no-cache"); //不 缓存
header("Expires: 0");
echo "你要输出的内容";
echo file_get_contents("文件名.后缀名");
exit;
?>
文件是通过PHPExcel生成的xls文件
其实你这个就是一个下载前显示一段广告,真正下载时关闭,不知道我的理解对吗你用ajax方式是没有办法进行下载的,可以在页面隐藏一个iframe,点击“下载”按钮时,弹出一个提示框,延迟5秒关闭,然后iframe的src指定下载文件,就可以有保存框了!
你的理解是对的,但是,文件是动态生成的,也许是5秒,也许是20秒,不固定,不能用延迟的方法,不知道您有什么好的方案?
1、ajax动态请求生成的文件缓存,如果已经生成完毕,关闭提示框,iframe触发下载
2、没有的话,就重复请求,直到文件缓存生成完毕
3、关于文件缓存的删除,一般是保留保留1-2天或者更少的时间,然后就删除了,防止盗链因为浏览器接受到不能处理的文件时,一般会提示你保存下载,这个时候,你已经不能用任何的客户端脚本进行监控浏览器发出的下载请求,也不能得知浏览器什么时候得到response信息,仅仅能把所有事情做好以后,才通知浏览器做具体的事情!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>test</title>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" /><script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$("#down").click(function(){
$('body').append("<div id='tan' style='width:300px;height:150px;z-index:999'><img src='ajaxloading.gif'/>正在下载...请等候!谢谢!</div>");
// 处理其他事情
alert('处理其他事情'); // 隐藏提示框
$('#tan').hide(); // 触发下载
$('#idown').attr('src', 'http://download.pchome.net/internet/browser/browser/redirectsrv-141895-8.html');
});
});
</script>
</head>
<body>
<input type="button" id="down" value="下载">
<iframe id="idown" style="display:none"></iframe>
</body>
</html>
感谢您的回答。我试一下
$('#idown').attr('src', '这里可以是另一个PHP文件,包含输出头的文件,能直接下载XLS文件');