2012-06-20 53 views
2

在我的struts應用程序中,用戶可以從服務器下載文件。Struts中的文件下載啓動事件

我想在點擊按鈕(啓動下載)和準備下載文件之間的時間內顯示微調。是否有文件開始下載時觸發​​的事件?我認爲這將是某種頁面加載事件。

這是我的支柱XML部分:

<action name="getFile" method="getFile" class="foo.pack.TAction"> 
    <result name="success" type="stream"> 
     <param name="contentType">application/pdf</param> 
     <param name="contentDisposition">attachment;filename=${fileName}</param> 
    </result> 
    <result name="login" type="redirect">/login</result> 
    <result name="error" type="tiles">showError</result> 
</action> 

在按一下按鈕,我設置window.location = localhost:8080/getFile.action 文件接下來的下載(後n秒)

什麼是展現方式在從服務器獲取文件的時間期間微調嗎?

+0

我相信與執行和等待攔截http://struts.apache.org/2.3.1/docs/execute-and-wait-interceptor.html會給你想要的結果一點點的工作。我相信你是使用Struts2而不是struts1? –

回答

2

對於這個答案,我會認爲 「普通」 JSP/Servlet的/ HTML/JS,因爲我不使用Struts。對於一個高級的Struts(和jQuery)用戶來說,它應該足夠小以將它移植到Struts(和jQuery)。

至此,您可以在下載請求的響應中設置一個cookie,並讓JavaScript爲該cookie進行輪詢。一旦下載準備就緒,cookie就會以JavaScript提供。爲了確保在同一會話中的各種瀏覽器窗口/標籤中工作,最好的做法是生成一個唯一的下載令牌並將其作爲請求參數傳回,以便服務器端可以將其設置爲cookie值。不要忘記爲了防止餅乾污染,以後過期餅乾。

基本上(你可以用一個<img>指向一些微調GIF替代<span>):

<input type="button" value="Download" onclick="download()" /> 
<span id="wait" style="display:none">Please wait while we prepare the download...</span> 

有了這個JavaScript(使用jQuery的時候,該jquery-cookie plugin可能會有所幫助):

function download() { 
    var token = new Date().getTime(); 
    var wait = document.getElementById("wait"); 
    wait.style.display = "block"; 

    var pollDownload = setInterval(function() { 
     if (document.cookie.indexOf("download=" + token) > -1) { 
      document.cookie = "download=" + token + "; expires=" + new Date(0).toGMTString() + "; path=/"; 
      wait.style.display = "none"; 
      clearInterval(pollDownload); 
     } 
    }, 500); 

    window.location = "download?token=" + token; 
} 

並且在servlet中(或Struts操作,如果適用):

// Prepare download here. 
// ... 

// Once finished, set cookie and stream download to response. 
Cookie cookie = new Cookie("download", request.getParameter("token")); 
cookie.setPath("/"); 
response.addCookie(cookie); 
// ... 
0

如果你有一箇中間html視圖,那麼你可以添加一些延遲的javascript動作來顯示一個微調,而在後臺調用localhost:8080/getFile.action。無論如何,一旦下載完成,我不知道如何隱藏微調器。

+0

你可以使用一個cookie。 – BalusC

+0

我沒有中間html視圖,因此沒有JavaScript。 –

+0

它也可以在當前視圖上完成。 – BalusC

0

您不能僅使用客戶端腳本來完成此操作,因爲下載完成時沒有任何事件。

使用struts2-jquery並給出一個Ajax調用getFile.action,同時你也會需要使用以下標籤LIB爲了使Ajax調用:

<%@ taglib prefix="s" uri="/struts-tags"%> 
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%> 

添加以下行內幕你的頭標記,也隱藏的圖像標籤。

<head> 
    <sj:head locale="de" jqueryui="true" defaultIndicator="myDefaultIndicator"/> 
     </head> 

<body> 
.............. 

    <img id="myDefaultIndicator" src="images/ajax-loader.gif" alt="Loading..." style="display:none"/> 
............... 
</body> 

Reference Link.