2013-10-03 24 views
1

這可能是一個非常簡單的問題的響應按鈕,但實際上我還沒有看到這麼多的搜索結果。重新啓用表單提交的文件下載

我有一個非常基本的提交按鈕,在需要一些用戶輸入的表單中,並在服務器的臨時目錄中生成可下載文件,然後提示用戶下載此文件,然後在提交時禁用此文件:

<form action="Home" method="post" onsubmit="Submit.disabled = true; return true;"> 
... 
<input type="submit" name="Submit" value="Submit" id="Submit" /> 

我們需要在頁面創建文件時禁用它幾秒鐘,然後提示用戶下載它。一旦文件被創建,它提供了以下響應回到我們SelectionServlet.java這樣瀏覽器就可以下載這個生成的文件如:文件可供下載

  if (Export.equals("PDF")){ 
       response.setContentType(".pdf"); 
       response.setHeader("Content-disposition", "attachment; filename="+Constants.FILE_NAME+".pdf"); 
       File dlFile = new File(Constants.FILE_LOCATION+".pdf"); 

       // This should send the file to browser 
       OutputStream outStream = response.getOutputStream(); 
       FileInputStream in = new FileInputStream(dlFile); 
       byte[] buffer = new byte[4096]; 
       int length; 
       while ((length = in.read(buffer)) > 0){ 
        outStream.write(buffer, 0, length); 
       } 
       in.close(); 
       outStream.flush(); 
       Export="HTML"; 
      } 

後,我想重新啓用提交按鈕,以便用戶可以重新使用它們放入的表單數據(不進行頁面重定向,因爲用戶基本上只是選擇要構建的文件的標準,以及它是什麼文件類型, 「提交」按鈕最終將我們帶到一個連接到源的Java Web連接,並將各種文件類型構建到服務器的臨時目錄中,供用戶下載)。

我已經在Chrome打過來,我實際上可以刪除提交按鈕disabled屬性,然後再次但是不同的標準按一下按鈕,得到了不同的結果返回。什麼代碼實際上可以做到這一點,我不確定。

+0

是什麼原因導致它去到下一個頁面上提交? – developerwjk

+0

@developerwjk:OP在提交時正在提供附件(文件下載)。 – BalusC

回答

3

坐落在文件下載的響應一個cookie,讓JavaScript的支票上的時間間隔的cookie。一旦文件下載是可以投放,因此另存爲對話框事情正在發生,那麼cookie將提供給JavaScript。爲確保在同一會話中的多個瀏覽器窗口/選項卡上正常工作,最好的做法是在JavaScript中生成一個唯一標記,並將其作爲請求參數傳遞給下載請求,並讓該servlet將其設置爲cookie值。

基本上,這應該這樣做:

<form action="Home" method="post" onsubmit="startDownload(this)"> 
    ... 
    <input type="hidden" name="token" /> 
    <input type="submit" name="Submit" value="Submit" id="Submit" /> <!-- I'd rather rename and lowercase the ID/name. --> 
</form> 

有了這個JavaScript(使用jQuery的時候,該jquery-cookie plugin可能有助於減少document.cookie冗長):

function startDownload(form) { 
    var token = new Date().getTime(); 
    form.token.value = token; 
    form.Submit.disabled = true; 

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

而且在servlet:

// Prepare download here. 
// ... 

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

// Now stream download to response. 
// ... 
相關問題