Jsf文件下载不起作用

时间:2013-02-28 09:13:16

标签: jsf java-ee jsf-2 icefaces

当我点击h:commandButton时,它会执行myBean.dowanlod()方法,但它不会下载任何文件。 这是我在backing bean中的方法。没有例外。光标变得忙碌,似乎在等待响应。是否有此类操作的其他配置或此代码是否有任何错误?

<h:commandButton value="download" action="#{myBean.download()}" /> 

@ManagedBean
@SessionScoped    
public class MyBean implements Serializable{
   //....

   public String download{

    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();

    String fileName = "test.txt";
    String filePath = "D:\\test.txt"; //externalContext.getRealPath("") + File.separator + fileName;
    File file = new File(filePath);

    externalContext.setResponseHeader("Content-Type", "text/plain");
    externalContext.setResponseHeader("Content-Length", String.valueOf(file.length()));
    externalContext.setResponseHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");


    InputStream input = null;
    OutputStream output = null;

    try {
        input = new FileInputStream(file);
        output = externalContext.getResponseOutputStream();
        IOUtils.copy(input, output);
    } catch (FileNotFoundException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        IOUtils.closeQuietly(output);
        IOUtils.closeQuietly(input);
    }

    facesContext.responseComplete();
    return null;
  }

  //...
}

2 个答案:

答案 0 :(得分:2)

ICEfaces有一个奇怪的“feature”,它隐式地将所有标准JSF <h:commandButton>转换为启用了ajax的命令按钮。但是,使用ajax下载文件是不可能的。您需要明确地将其关闭。您可以通过嵌套<f:ajax disabled="true">来按每个按钮执行此操作。

<h:commandButton value="download" action="#{myBean.download()}" />
    <f:ajax disabled="true"/>
</h:commandButton>

另见:

答案 1 :(得分:0)

之前我有<h:head><ice:form>。此文件下载事件不适用于这些命名空间。只需使用<head><h:form>即可解决问题。我正在学习JSF,所以我对此一无所知。不知怎的,它对我有用。 我从BalusC's blog找到了更好的文件下载教程。如果有人知道或可以猜出原因,请提出一些想法。