Button/Link
Data
Input
Miscellaneous
Multimedia
Output
Panel
Select
JSTL
Faces Core
Facelets
Extensions

Note

The default limit for the com.liferay.faces.util.uploadedFileMaxSize context-param is 104857600 bytes (100MB). But in order to support that limit, it may be necessary to set <Connector maxPostSize=104857600"> in tomcat/conf/server.xml since the default value is only 2097152 bytes (2MB).

alloy:inputFile

InputFile is a UIInput component that renders an <input> element with type="file". Since it extends HtmlInputFile, it supports all the features of h:inputFile and also supports multi-file uploads, instant-Ajax, preview, upload progress, and validation.

Instant Ajax Usage

Files can be uploaded instantly via Ajax by setting auto=true and by adding an f:ajax child tag. Note: this feature can only be used with JSF 2.2.

                   

Source Code

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:alloy="http://liferay.com/faces/alloy"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<alloy:form enctype="multipart/form-data">
<alloy:messages globalOnly="true" layout="table" />
<alloy:inputFile auto="true" fileUploadListener="#{inputFileBackingBean.handleFileUpload}">
<f:ajax render=":resultsForm:modelValue" />
</alloy:inputFile>
</alloy:form>
<alloy:form id="resultsForm">
<ui:include src="../inputFileCommon.xhtml" />
</alloy:form>
</ui:composition>
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:alloy="http://liferay.com/faces/alloy"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core" xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<c:set value="#{inputFileModelBean.uploadedFiles.size()}" var="totalFiles" />
<alloy:dataTable rendered="#{totalFiles > 0}" styleClass="files"
value="#{inputFileModelBean.uploadedFiles}" var="uploadedFile">
<alloy:column>
<alloy:commandButton actionListener="#{inputFileBackingBean.deleteUploadedFile}"
onclick="if (! confirm('#{i18n['are-you-sure-you-want-to-delete-this']}')) {return false;}"
render="@form" value="#{uploadedFile.id}">
<alloy:icon name="trash" />
</alloy:commandButton>
</alloy:column>
<alloy:column>
<f:facet name="header">
<alloy:outputText rendered="#{totalFiles > 0}" value="#{i18n['file-name']}" />
</f:facet>
<alloy:outputText value="#{uploadedFile.name}" />
</alloy:column>
<alloy:column>
<f:facet name="header">
<alloy:outputText rendered="#{totalFiles > 0}" value="#{i18n['size']}" />
</f:facet>
<alloy:outputText value="#{uploadedFile.size}" />
</alloy:column>
</alloy:dataTable>
</ui:composition>
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@ViewScoped
@ManagedBean
public class InputFileModelBean implements Serializable {
// serialVersionUID
private static final long serialVersionUID = 201172404377673109L;
// Logger
private static final Logger logger = LoggerFactory.getLogger(InputFileModelBean.class);
// Private Data Members
private boolean appendNewFiles;
private boolean auto;
private List<UploadedFile> uploadedFiles;
public List<UploadedFile> getUploadedFiles() {
return uploadedFiles;
}
public boolean isAppendNewFiles() {
return appendNewFiles;
}
public boolean isAuto() {
return auto;
}
@PostConstruct
public void postConstruct() {
this.uploadedFiles = new ArrayList<UploadedFile>();
}
@PreDestroy
public void preDestroy() {
for (UploadedFile uploadedFile : uploadedFiles) {
try {
uploadedFile.delete();
}
catch (IOException e) {
logger.error(e);
}
}
uploadedFiles = null;
}
public void setAppendNewFiles(boolean appendNewFiles) {
this.appendNewFiles = appendNewFiles;
if (appendNewFiles) {
this.auto = false;
}
}
public void setAuto(boolean auto) {
this.auto = auto;
if (auto) {
this.appendNewFiles = false;
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@RequestScoped
@ManagedBean
public class InputFileBackingBean {
// Logger
private static final Logger logger = LoggerFactory.getLogger(InputFileBackingBean.class);
@ManagedProperty(value = "#{inputFileModelBean}")
private InputFileModelBean inputFileModelBean;
public void deleteUploadedFile(ActionEvent actionEvent) {
UICommand uiCommand = (UICommand) actionEvent.getComponent();
String fileId = (String) uiCommand.getValue();
try {
List<UploadedFile> uploadedFiles = inputFileModelBean.getUploadedFiles();
UploadedFile uploadedFileToDelete = null;
for (UploadedFile uploadedFile : uploadedFiles) {
if (uploadedFile.getId().equals(fileId)) {
uploadedFileToDelete = uploadedFile;
break;
}
}
if (uploadedFileToDelete != null) {
uploadedFileToDelete.delete();
uploadedFiles.remove(uploadedFileToDelete);
logger.debug("Deleted file=[{0}]", uploadedFileToDelete.getName());
}
}
catch (Exception e) {
logger.error(e);
}
}
public void handleFileUpload(FileUploadEvent fileUploadEvent) {
List<UploadedFile> uploadedFiles = inputFileModelBean.getUploadedFiles();
UploadedFile uploadedFile = fileUploadEvent.getUploadedFile();
if (uploadedFile.getStatus() == UploadedFile.Status.FILE_SAVED) {
FacesContext facesContext = FacesContext.getCurrentInstance();
FacesMessage facesMessage = new FacesMessage("Received fileUploadEvent for file named '" +
uploadedFile.getName() + "' in the " + fileUploadEvent.getPhaseId().toString() + " phase.");
facesContext.addMessage(null, facesMessage);
uploadedFiles.add(uploadedFile);
logger.debug("Received fileName=[{0}] absolutePath=[{1}]", uploadedFile.getName(),
uploadedFile.getAbsolutePath());
}
else {
logger.error("Failed to receive uploaded file due to error status=[{0}] message=[{1}]",
uploadedFile.getStatus(), uploadedFile.getMessage());
}
}
public void setInputFileModelBean(InputFileModelBean inputFileModelBean) {
// Injected via @ManagedProperty annotation
this.inputFileModelBean = inputFileModelBean;
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Liferay Faces Alloy 4.1.1 + Liferay Faces Bridge Implementation 5.0.0 + Showcase Common 4.0.0 + Liferay Faces Util 3.4.1 + Mojarra 2.2.20