3

当我单击h:commandButton它时,它会执行该myBean.dowanlod()方法,但它不会下载任何文件。这是我在支持 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;
  }

  //...
}
4

2 回答 2

3

ICEfaces 有一个奇怪的“特性”,它将所有标准 JSF 隐式转换<h:commandButton>为支持 ajax 的命令按钮。但是,无法使用 ajax 下载文件。您需要明确将其关闭。您可以通过嵌套一个<f:ajax disabled="true">.

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

也可以看看:

于 2013-02-28T12:26:53.813 回答
0

以前我有<h:head><ice:form>。此文件下载内容不适用于这些名称空间。只需使用<head><h:form>解决问题。我正在学习JSF,所以我对此一无所知。不知何故,它对我有用。我从BalusC 的博客中找到了更好的文件下载教程。如果有人知道或猜到原因,请给出一些想法。

于 2013-02-28T09:44:41.933 回答