使用struts2和Ajax下载文件时如何设置进度条

我无法放入进度条,因为它直接重定向页面并下载文件。

在一个问题中有很多问题(大多数是隐含的)!

使用struts2和Ajax下载文件时如何设置进度条

  1. 如果不需要,请不要使用AJAX下载。 在浏览器中打开文件( contentDisposition: inline )时,只需使用新的Tab(/ Window)。 下载文件( contentDisposition: attachment )时,当前页面不会受到影响。 您可以在此答案中找到几种方法来执行此操作,例如:

      value1  download 

我们怎么能把浏览器进度条?

  1. 每个浏览器都有一个内置的进度条,在下载文件时显示:

    在此处输入图像描述

    仅在尚未提供要下载的文件长度的情况下,浏览器才能绘制进度条。 要指示浏览器,您可以使用contentLength标头,该标头也可直接在Stream结果中使用:

      image/jpeg attachment;filename="document.pdf" ${lengthOfMyFile}  
     private long lengthOfMyFile; // with Getter public String execute(){ /* file loading and stuff ... */ lengthOfMyFile = myFile.length(); return SUCCESS; } 

假设文件太重了。 所以需要时间,所以我想阻止用户不要点击其他按钮

  1. 如果要节省带宽 ,则需要处理Web服务器配置。 本文可能有所帮助:

    • 限制每个客户端的下载次数

    如果您不关心防止泛滥请求,但只是为了防止客户端的多个并发下载 ,您可以使用会话变量,放在开头并在方法结束时删除,检查它是否存在于开头你的下载动作。 如果存在,则不会下载,否则,您将:

     // The Action must implement the SessionAware interface private Map session; // with Setter private final static String BUSY = "I'm busy. Try again"; public String execute(){ if (session.get(BUSY)!=null){ LOG.debug("Another download is in progress. I stop here"); return NONE; } try { session.put(BUSY,BUSY); /* file loading and stuff ... */ } finally { session.remove(BUSY); return SUCCESS; } } 

    好老信号量。