我无法放置进度栏,因为它直接重定向页面并下载了文件。
一个问题中有这么多的问题(大多数都是隐性的)!
使用struts2和Ajax下载文件时如何放置进度栏
如果不需要,请不要使用AJAX下载。在浏览器(contentDisposition: inline
)中打开文件时,只需使用新的Tab(/ Window)。当您下载文件(contentDisposition: attachment
)时,当前页面不会受到影响。您可以在此答案中找到几种方法来执行此操作,例如:
<s:url action="downloadAction.action" var="url">
<s:param name="param1">value1</s:param>
</s:url>
<s:a href="%{url}" >download</s:a>
如何放置浏览器进度条?
每个浏览器都有一个内置的进度条,下载文件时会显示该进度条:
仅在未提供要下载文件的长度的情况下,浏览器才能绘制进度条。要指示浏览器,您可以使用contentLength
标题,该标题也可以直接在Stream结果中使用:
<result name="success" type="stream">
<param name="contentType">image/jpeg</param>
<param name="contentDisposition">attachment;filename="document.pdf"</param>
<param name="contentLength">${lengthOfMyFile}</param>
</result>
private long lengthOfMyFile; // with Getter
public String execute(){
/* file loading and stuff ... */
lengthOfMyFile = myFile.length();
return SUCCESS;
}
假设文件太重。所以这需要时间,所以我想防止用户不要单击其他按钮
如果要节省带宽,则需要进行Web服务器配置。本文可能会有所帮助:
相反,如果您不关心阻止泛滥的请求,而只是防止客户端进行多个并发下载,则可以使用会话变量,将其放在方法的开头并在方法的末尾删除,并在方法的开头检查其是否存在。您的下载操作。如果存在,则不会下载,否则,您将:
// The Action must implement the SessionAware interface
private Map<String,Object> 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;
}
}
好旧的信号量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句