2016-03-01 14 views
0

將文件下載到不使用fileDownloadActionListener我添加了一個頁面上的一個按鈕下載文件:沒有fileDownloadActionListener

<af:commandButton text="Download" id="cb1" partialSubmit="true" actionListener="#{bean.downloadListener}"/> 

和動作監聽我寫了以下內容:

FacesContext fc = FacesContext.getCurrentInstance(); 
ExternalContext ec = fc.getExternalContext(); 
ec.redirect("http://download-server/file"); 
fc.responseComplete(); 

的問題是, 第一次下載後,按鈕停止響應,點擊

我也嘗試將數據寫入響應流是這樣的:

FacesContext fc = FacesContext.getCurrentInstance(); 
ExternalContext ec = fc.getExternalContext(); 
ec.responseReset(); 
ec.setResponseContentType("application/xls"); 
ec.setResponseHeader("Content-Disposition", "attachment; filename=\"report.xls\""); 
OutputStream out = ec.getResponseOutputStream(); 
// write the data 
out.close(); 
fc.responseComplete(); 

,甚至得到一個HttpServletResponse的:

HttpServletResponse resp = (HttpServletResponse)ec.getResponse(); 
resp.addHeader("Content-Disposition", "attachment; filename=\"report.xls\""); 
resp.addHeader("Content-Type", "application/xls"); 
OutputStream out = resp.getOutputStream(); 
// write the data 
out.close(); 
fc.responseComplete(); 

但既不工程。

我能做些什麼來使它工作?

回答

0

我用JavaScript代碼來實現這一點:

final FacesContext fc = FacesContext.getCurrentInstance();  
final ExtendedRenderKitService erks = 
    Service.getService(fc.getRenderKit(), ExtendedRenderKitService.class); 
erks.addScript(fc, String.format("window.location = '%s';", escapeSingleQuotes(url))); 

或者,而不是分配window.location,使用內嵌框架下載:

erks.addScript(
    fc, 
    String.format("var downloadUrl = '%s';", escapeSingleQuotes(url)) + 
    "var frame = document.createElement('iframe');" + 
    "frame.setAttribute('src', downloadUrl);" + 
    "frame.style.border = '0';" + 
    "frame.style.clip = 'rect(0 0 0 0)';" + 
    "frame.style.width = '1px';" + 
    "frame.style.height = '1px';" + 
    "frame.style.margin = '-1px';" + 
    "frame.style.padding = '0';" + 
    "frame.style.position = 'absolute';" + 
    "document.body.appendChild(frame);" 
);