FileDownload is used to stream binary contents like files stored in database to the client. FileDownload is used by attaching it to any JSF command component like button or a link. Additionally presentation of download can be configured with the contentDisposition attribute that takes either "attachment" or "inline" as a value.
<script>
//<![CDATA[
function start() {
PF('statusDialog').show();
}
function stop() {
PF('statusDialog').hide();
}
//]]>
</script>
<div class="card">
<p:dialog modal="true" widgetVar="statusDialog" header="Status" draggable="false" closable="false"
resizable="false">
<i class="pi pi-spinner pi-spin" style="font-size:3rem"></i>
</p:dialog>
<h:form>
<p:commandButton value="Download" ajax="false" onclick="PrimeFaces.monitorDownload(start, stop);"
icon="pi pi-arrow-down" styleClass="mr-2">
<p:fileDownload value="#{fileDownloadView.file}"/>
</p:commandButton>
<p:commandButton value="Ajax Download" icon="pi pi-arrow-down" styleClass="ui-button-outlined">
<p:fileDownload value="#{fileDownloadView.file}"/>
</p:commandButton>
</h:form>
</div>
package org.primefaces.showcase.view.file;
import jakarta.enterprise.context.RequestScoped;
import jakarta.faces.context.FacesContext;
import jakarta.inject.Named;
import io.quarkus.runtime.annotations.RegisterForReflection;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
@Named
@RequestScoped
@RegisterForReflection(serialization = true)
public class FileDownloadView {
private final StreamedContent file;
public FileDownloadView() {
file = DefaultStreamedContent.builder()
.name("downloaded_boromir.jpg")
.contentType("image/jpg")
.stream(() -> FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/resources/demo/images/boromir.jpg"))
.build();
}
public StreamedContent getFile() {
return file;
}
}