使用 struts2 和 Ajax 下载文件时如何放置进度条
How to put progress bar when downloading file using struts2 and Ajax
我无法放置进度条,因为它直接重定向页面并下载文件。
这么多问题(其中大部分是隐含的)在一个问题中!
How to put progress bar when downloading file using struts2 and Ajax
如无必要请不要使用AJAX下载。当您在浏览器 (contentDisposition: inline
) 中打开文件时,只需使用一个新的 Tab(/Window)。下载文件(contentDisposition: attachment
)时,当前页面不会受到影响。您可以在 this answer 中找到几种方法,例如:
<s:url action="downloadAction.action" var="url">
<s:param name="param1">value1</s:param>
</s:url>
<s:a href="%{url}" >download</s:a>
how can we put browser progress bar?
每个浏览器都有一个在下载文件时显示的内置进度条:
只有在未提供下载文件长度的情况下,浏览器才能绘制进度条。要指示浏览器,您可以使用 contentLength
header,它也可以直接在 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;
}
Suppose if file is too heavy. So it take time so I want to prevent user not click to other button
如果您想要节省带宽,那么您需要处理您的Web 服务器 配置。这篇文章可能会有所帮助:
如果您不关心防止泛洪请求,而只是防止客户端的多个并发下载,您可以使用 session 变量,放在开始并在方法结束时删除,在下载操作开始时检查它是否存在。存在则不下载,否则:
// 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;
}
}
好的老信号量。
我无法放置进度条,因为它直接重定向页面并下载文件。
这么多问题(其中大部分是隐含的)在一个问题中!
How to put progress bar when downloading file using struts2 and Ajax
如无必要请不要使用AJAX下载。当您在浏览器 (
contentDisposition: inline
) 中打开文件时,只需使用一个新的 Tab(/Window)。下载文件(contentDisposition: attachment
)时,当前页面不会受到影响。您可以在 this answer 中找到几种方法,例如:<s:url action="downloadAction.action" var="url"> <s:param name="param1">value1</s:param> </s:url> <s:a href="%{url}" >download</s:a>
how can we put browser progress bar?
每个浏览器都有一个在下载文件时显示的内置进度条:
只有在未提供下载文件长度的情况下,浏览器才能绘制进度条。要指示浏览器,您可以使用
contentLength
header,它也可以直接在 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; }
Suppose if file is too heavy. So it take time so I want to prevent user not click to other button
如果您想要节省带宽,那么您需要处理您的Web 服务器 配置。这篇文章可能会有所帮助:
如果您不关心防止泛洪请求,而只是防止客户端的多个并发下载,您可以使用 session 变量,放在开始并在方法结束时删除,在下载操作开始时检查它是否存在。存在则不下载,否则:
// 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; } }
好的老信号量。