Ваша первая проблема - вы пытаетесь загрузить файл по запросу Ajax. Это невозможно. Ajax выполняется и управляется кодом JavaScript. В JavaScript из-за ограничений безопасности нет средств для запуска диалога Сохранить как . Вместо этого вам нужно запустить полноценный синхронный запрос. Исходная страница в любом случае останется прежней, если для размещения содержимого установлено значение attachment
.
Итак, вам нужно как минимум <h:commandButton>
или <p:commandButton ajax="false">
.
Ваша вторая проблема, с которой вы столкнулись при попытке использовать <p:fileDownload>
, заключается в том, что value
должен указывать на метод, возвращающий StreamedContent
, а не void
. Вы связали его с void
методом и, следовательно, ничего не будет возвращено.
Итак, вам нужно вернуть StreamedContent
на <p:fileDownload>
значение.
Ваша третья проблема заключается в том, что вы получаете файл как ресурс classpath ServletContext#getResourceAsStream()
(который, как я полагаю, вы слепо копировали из примера демонстрации PrimeFaces, который, в свою очередь, сам по себе также довольно беден, он мог просто использовать ExternalContext#getResourceAsStream()
вместо этого без необходимости извлекать ServletContext
из-под колпаков JSF, но это в сторону) вместо FileInputStream
, как в исходном коде.
Итак, любое из этих решений должно помочь:
<p:treeNode type="file" icon="ui-icon-document">
<p:commandButton value="#{node}" ajax="false">
<p:fileDownload value="#{documentsController.download(node)}" />
</p:commandButton>
</p:treeNode>
с
public StreamedContent download(String path) {
File file = new File(path);
InputStream input = new FileInputStream(file);
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
return new DefaultStreamedContent(input, externalContext.getMimeType(file.getName()), file.getName());
}
или
<p:treeNode type="file" icon="ui-icon-document">
<h:commandButton value="#{node}" action="#{documentsController.download(node)}" />
</p:treeNode>
с исходным методом onNodeSelect()
с аргументом, измененным на String path
.