Primefaces文件下载不工作



试图获得一个简单的文件下载工作,所有我得到的是一个挂AJAX状态栏,这就是它。我的备份bean输出在准备和下载中呈现正确的名称。

我做错了吗?在我看来,两个输出似乎都是正确的。

JSF 2.0

Primefaces 3.4

        <h:form>
            <p:commandButton id="downloadLink" value="Download" actionListener="#{filemanagement.prepDownload}"> 
                <p:fileDownload value="#{filemanagement.download}" />
            </p:commandButton>
        </h:form>

支持bean:

private DefaultStreamedContent download;
public void setDownload(DefaultStreamedContent download) {
    this.download = download;
}
public DefaultStreamedContent getDownload() throws Exception {
    System.out.println("GET = " + download.getName());
    return download;
}
public void prepDownload() throws Exception {
    File file = new File("C:\file.csv");
    InputStream input = new FileInputStream(file);
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    setDownload(new DefaultStreamedContent(input, externalContext.getMimeType(file.getName()), file.getName()));
    System.out.println("PREP = " + download.getName());
}

Primefaces指南版本>= 10:

对于10之前的Primefaces版本,您必须在commandButtonajax=false上禁用ajax。

从版本10开始不再需要,请参阅Primefaces Documentation 10。

Guide for Primefaces version <10:

参见Primefaces Documentation 6.2

如果你想使用PrimeFaces commandButton和commandLink,禁用ajax选项asfileDownload需要刷新整个页面来显示文件。

<h:form>
  <p:commandButton id="downloadLink" value="Download" ajax="false" actionListener="#{filemanagement.prepDownload}">
    <p:fileDownload value="#{filemanagement.download}" />
  </p:commandButton>
</h:form>

在命令按钮中,设置ajax=false,并且不使用动作或动作监听器。

<h:form>
  <p:commandButton id="downloadLink" value="Download" ajax="false">
    <p:fileDownload value="#{filemanagement.downloadValue}" />
  </p:commandButton>
</h:form>

豆:

public StreamedContent getDownloadValue() throws Exception {
    StreamedContent download=new DefaultStreamedContent();
    File file = new File("C:\file.csv");
    InputStream input = new FileInputStream(file);
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    download = new DefaultStreamedContent(input, externalContext.getMimeType(file.getName()), file.getName()));
    System.out.println("PREP = " + download.getName());
    return download;
}

从PrimeFaces 10及以上,可以使用Ajax下载!

https://primefaces.github.io/primefaces/10_0_0//组件/filedownload吗?id = ajax-downloading

当您在命令按钮或链接上使用Ajax时,将由JavaScript触发下载。

参见:

https://github.com/primefaces/primefaces/issues/5978

我所做的最重要的事情是把ajax="false"。

这里我有一个commandlink,正如你在下面看到的。

html:

<p:commandLink id="someId"
                value="Download"
                style="padding-left: 2em; vertical-align: middle;"
                ajax="false"
                onstart="PF('pageBlocker').show()"
                oncomplete="PF('pageBlocker').hide()">
  <p:fileDownload value="#{bean.downloadFileTemplate()}" />
</p:commandLink>

在Java中:

public StreamedContent downloadFileTemplate() {
    try {
        FileInputStream inputStream = new FileInputStream(new File(getClass().getClassLoader().getResource("path_to_resource/myfile.xlsx").getFile()));
        StreamedContent fileTemplate = new DefaultStreamedContent(
                inputStream
                , "application/vnd.ms-excel"
                , "my_file.xlsx");
        return fileTemplate;
    } catch (Exception e) {
        getLog().error("Error on download...", e);
        return null;
    }
}

相关内容

  • 没有找到相关文章

最新更新