需求:
1.点击画面上的下载按钮,可以下载文件
2.点击按钮时,弹出层(其他按钮不可用),显示一段文本
3.弹出下载文件对话框时,弹出层自动消失(隐藏)

解决方案 »

  1.   

    大概的思路结构代码为:
    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;
    ?> 
      

  2.   

    To falizixun2:您给的代码效果理解是正确的,只是我使用您提供的方法时,如何弹出文本保存框呢?
      

  3.   

    TO falizixun2:
    文件是通过PHPExcel生成的xls文件
      

  4.   


    其实你这个就是一个下载前显示一段广告,真正下载时关闭,不知道我的理解对吗你用ajax方式是没有办法进行下载的,可以在页面隐藏一个iframe,点击“下载”按钮时,弹出一个提示框,延迟5秒关闭,然后iframe的src指定下载文件,就可以有保存框了!
      

  5.   

    To hnxxwyq:
    你的理解是对的,但是,文件是动态生成的,也许是5秒,也许是20秒,不固定,不能用延迟的方法,不知道您有什么好的方案?
      

  6.   

    这种做法,我一般会这样做
    1、ajax动态请求生成的文件缓存,如果已经生成完毕,关闭提示框,iframe触发下载
    2、没有的话,就重复请求,直到文件缓存生成完毕
    3、关于文件缓存的删除,一般是保留保留1-2天或者更少的时间,然后就删除了,防止盗链因为浏览器接受到不能处理的文件时,一般会提示你保存下载,这个时候,你已经不能用任何的客户端脚本进行监控浏览器发出的下载请求,也不能得知浏览器什么时候得到response信息,仅仅能把所有事情做好以后,才通知浏览器做具体的事情!
      

  7.   

    关于iframe触发下载,您能提供一下示例代码吗?
      

  8.   


    <!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>
      

  9.   

    To hnxxwyq:
    感谢您的回答。我试一下
      

  10.   

    或者你可以这么做,PHP文件只负责生存XLS文件,在PHP里判断那个xls文件是否已经生成,file_exists('动态生成的XLS文件名');再把文件名给前端,这样,JS只有在XLS已经生成存在的时候才会返回数据给前端!然后在把那个框架导向另一个PHP,就像:
      $('#idown').attr('src', '这里可以是另一个PHP文件,包含输出头的文件,能直接下载XLS文件');