解决方案 »

  1.   


    点击导出按钮,就是调用后台生成,生完了直接下载,这个时间根据数据量不同,时间也不同,不想让用户无限点击导出按钮,所以设置了点击一次之后,置灰,等待后台生成,再将按钮还原。使用submit提交,后台用HttpServletResponse存放生成的文件,返回后,会弹出下载框。但是使用局部提交后,不知道如何让ajax回调函数接收HttpServletResponse的文件,进行下载?
      

  2.   

    用$.get()或者$.ajax()通过设置请求头中的预期返回数据类型
      

  3.   

    如果生成完成就直接下载,则直接给前台回一个标识符,标识完成。
    比如给一个alert框,然后点击alert框后,触发另一个servlet,进行文件下载
    第一次生成的文件保存在本地磁盘,然后第二次再触发下载方法,专门下载
    下载完成后,看是否需要删除文件,需要的话再把文件删除了
      

  4.   

    接上楼:xls的 类型为:application/vnd.ms-excel  
      

  5.   

    局部提交代码:
    $.post("download.do",
       function(result) {
    // 下载
        
    // 回复按钮置灰状态
            
       },"json"
    );
    之前是form提交,后台走完直接弹出下载框,前台没有进行什么处理。
    现在是局部提交了,后台走完,不弹下载框了,result是返回值,后台应该如何写才能下载文件?
      

  6.   

    回调方法里其实就可以接收流,但是出于浏览器安全原因无法处理。有两个解决方案:
    1、使用jQuery下载插件,这种很多,搜索一下。例如“jquery-file-download”  http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/
    2、Ajax不作发送及接收处理,只负责处理按钮状态,发送和接收工作交一个iframe,当iframe下载完成后会自动关闭,并触发关闭函数,在该函数后面解除按钮状态。
      

  7.   


    我之前使用form提交,下载没问题,现在就是局部提交,不知道后台应该如何写。
      

  8.   

    可以尝试用两个servlet,第一个servlet生成文件,第二个servlet去下载文件
    一个servlet只能给前台一个响应,给result,就不能给下载框;给下载框就不能给result。
    在回调方法里面再次触发文件下载servlet,直接下载就可以了
      

  9.   


    HttpServletResponse使用这个应该是把文件放到客户端了,下载后不会在服务器保留吧。具体机制我也不是很清楚。
    如果想要2次servlet的话,那么就要第一次的时候把文件存放到服务器的物理位置上,返回路径,第二次才能下载吧?
    现在后台的文件地址:
    response.setHeader("Content-disposition", "attachment;filename=" + new String((fileName+".xls").getBytes("gbk"),"iso-8859-1"));
    这应该是放缓存里了吧,直接就返回给客户端了。
      

  10.   

    接上,fileName不是一个绝对地址,只是文件名
      

  11.   

    可以将后台文件放在本地磁盘,像前台返回一个响应的result,并带上文件的绝对路径
    第二次servlet请求的时候,带上文件名和绝对路径,直接下载。
    response.getOutputStream() 会将输出流输送到浏览器
    第一个servlet直接生成文件,第二个servlet再下载就可以了