- All Implemented Interfaces:
ClientBehaviorHolder,EditableValueHolder,PartialStateHolder,StateHolder,TransientStateHolder,ValueHolder,ComponentSystemEventListener,FacesListener,SystemEventListenerHolder,EventListener
The <o:inputFile> is a component that extends the standard <h:inputFile> and
adds support for directory and maxsize
attributes, along with built-in server side validation on accept and maxsize attributes.
Usage
You can use it the same way as <h:inputFile>, you only need to change h: into
o: to get the extra support for accept, directory and maxsize
attributes. Here's are some usage examples.
Single file selection
It is basically not different from <h:inputFile>. You might as good use it instead.
<h:form enctype="multipart/form-data">
<o:inputFile value="#{bean.file}" />
<h:commandButton value="Upload" action="#{bean.upload}" />
</h:form>
private Part file; // +getter+setter
public void upload() {
if (file != null) {
var name = Servlets.getSubmittedFileName(file);
var type = file.getContentType();
var size = file.getSize();
var content = file.getInputStream();
// ...
}
}
Note that it's strongly recommended to use Servlets.getSubmittedFileName(Part) to obtain the submitted file
name to make sure that any path is stripped off. Some browsers are known to incorrectly include the client side path
or even a fake path along with the file name.
Multiple file selection
The multiple attribute can be set to true to enable multiple file selection.
With this setting the enduser can use control/command/shift keys to select multiple files.
It is basically also not different from <h:inputFile>. You might as good use it instead.
<h:form enctype="multipart/form-data">
<o:inputFile value="#{bean.files}" multiple="true" />
<h:commandButton value="Upload" action="#{bean.upload}" />
</h:form>
private List<Part> files; // +getter+setter
public void upload() {
if (files != null) {
for (var file : files) {
var name = Servlets.getSubmittedFileName(file);
var type = file.getContentType();
var size = file.getSize();
var content = file.getInputStream();
// ...
}
}
}
Folder selection
The directory attribute can be set to true to enable folder selection. This implicitly also
sets multiple attribute to true and renders an additional webkitdirectory
attribute to HTML for better browser compatibility.
<h:form enctype="multipart/form-data">
<o:inputFile value="#{bean.files}" directory="true" />
<h:commandButton value="Upload" action="#{bean.upload}" />
</h:form>
private List<Part> files; // +getter+setter
public void upload() {
if (files != null) {
for (var file : files) {
var name = Servlets.getSubmittedFileName(file);
var type = file.getContentType();
var size = file.getSize();
var content = file.getInputStream();
// ...
}
}
}
Do note that this does not send physical folders, but only files contained in those folders.
Media type filtering
The accept attribute can be set with a comma separated string of media types of files to filter in
browse dialog. An overview of all registered media types can be found at
IANA.
<h:form enctype="multipart/form-data">
<o:inputFile id="file" value="#{bean.losslessImageFile}" accept="image/png,image/gif" />
<h:commandButton value="Upload" action="#{bean.upload}" />
<h:message for="file" />
</h:form>
<h:form enctype="multipart/form-data">
<o:inputFile id="file" value="#{bean.anyImageFile}" accept="image/*" />
<h:commandButton value="Upload" action="#{bean.upload}" />
<h:message for="file" />
</h:form>
<h:form enctype="multipart/form-data">
<o:inputFile id="file" value="#{bean.anyMediaFile}" accept="audio/*,image/*,video/*" />
<h:commandButton value="Upload" action="#{bean.upload}" />
<h:message for="file" />
</h:form>
This will also be validated in the server side using a built-in validator. Do note that the accept
attribute only filters in client side and validates in server side based on the file extension, and this does thus
not strictly validate the file's actual content. To cover that as well, you should in the bean's action method parse
the file's actual content using the tool suited for the specific media type, such as ImageIO#read() for
image files, and then checking if it returns the expected result.
The default message for server side validation of accept attribute is:
{0}: Media type of file ''{1}'' does not match ''{2}''
Where {0} is the component's label and {1} is the submitted file name and {2}
is the value of accept attribute.
You can override the default message by the acceptMessage attribute:
<h:form enctype="multipart/form-data">
<o:inputFile id="file" value="#{bean.anyImageFile}" accept="image/*" acceptMessage="File {1} is unacceptable!" />
<h:commandButton value="Upload" action="#{bean.upload}" />
<h:message for="file" />
</h:form>
Or by the custom message bundle file as identified by <application><message-bundle> in
faces-config.xml. The message key is org.omnifaces.component.input.InputFile.accept.
org.omnifaces.component.input.InputFile.accept = File {1} is unacceptable!
File size validation
The maxsize attribute can be set with the maximum file size in bytes which will be validated on each
selected file in the client side if the client supports HTML5 File API. This validation will be performed by custom
JavaScript in client side instead of by Faces in server side. This only requires that there is a
<h:message> or <h:messages> component and that it has its id set.
<o:inputFile id="file" ... /> <h:message id="messageForFile" for="file" /> <!-- This must have 'id' attribute set! -->
This way the client side can trigger Faces via an ajax request to update the message component with the client side validation message. Noted should be that the file(s) will not be sent, hereby saving network bandwidth.
<h:form enctype="multipart/form-data">
<o:inputFile id="file" value="#{bean.file}" maxsize="#{10 * 1024 * 1024}" /> <!-- 10MiB -->
<h:commandButton value="Upload" action="#{bean.upload}" />
<h:message id="messageForFile" for="file" />
</h:form>
This will also be validated in the server side using a built-in validator.
The default message for both client side and server side validation of maxsize attribute is:
{0}: Size of file ''{1}'' is larger than maximum of {2}
Where {0} is the component's label and {1} is the submitted file name and {2}
is the value of maxsize attribute.
You can override the default message by the maxsizeMessage attribute:
<h:form enctype="multipart/form-data">
<o:inputFile id="file" value="#{bean.file}" maxsize="#{10 * 1024 * 1024}" maxsizeMessage="File {1} is too big!" />
<h:commandButton value="Upload" action="#{bean.upload}" />
<h:message id="messageForFile" for="file" />
</h:form>
Or by the custom message bundle file as identified by <application><message-bundle> in
faces-config.xml. The message key is org.omnifaces.component.input.InputFile.maxsize.
org.omnifaces.component.input.InputFile.maxsize = File {1} is too big!
- Since:
- 2.5
- Author:
- Bauke Scholtz
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final StringThe component type, which is "org.omnifaces.component.input.InputFile".Fields inherited from class jakarta.faces.component.html.HtmlInputFile
COMPONENT_FAMILYFields inherited from class jakarta.faces.component.UIInput
ALWAYS_PERFORM_VALIDATION_WHEN_REQUIRED_IS_TRUE, CONVERSION_MESSAGE_ID, EMPTY_STRING_AS_NULL_PARAM_NAME, REQUIRED_MESSAGE_ID, UPDATE_MESSAGE_ID, VALIDATE_EMPTY_FIELDS_PARAM_NAMEFields inherited from class jakarta.faces.component.UIComponent
ATTRS_WITH_DECLARED_DEFAULT_VALUES, BEANINFO_KEY, bindings, COMPOSITE_COMPONENT_TYPE_KEY, COMPOSITE_FACET_NAME, FACETS_KEY, VIEW_LOCATION_KEY -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoiddecode(FacesContext context) This override checks if client side validation on maxsize has failed and if multi file upload is enabled.voidencodeEnd(FacesContext context) This override will rendermultiple,directoryandacceptattributes accordingly.Returns validation message to be displayed when the condition inacceptattribute is violated.protected ObjectgetConvertedValue(FacesContext context, Object submittedValue) This override will convert the individual parts if multi file upload is enabled and collect only non-null parts having a non-empty file name and a file size above zero.Returns maximum size in bytes for each selected file.Returns validation message to be displayed when the condition inmaxsizeattribute is violated.An override which ensures that the Faces implementation being used doesn't save it in the state.booleanReturns whether or not to enable directory selection.voidsetAcceptMessage(String acceptMessage) Sets validation message to be displayed when the condition inacceptattribute is violated.voidsetDirectory(boolean directory) Sets whether or not to enable directory selection.voidsetMaxsize(Long maxsize) Sets maximum size in bytes for each selected file.voidsetMaxsizeMessage(String maxsizeMessage) Sets validation message to be displayed when the condition inmaxsizeattribute is violated.voidsetSubmittedValue(Object submittedValue) An override which ensures that the Faces implementation being used doesn't save it in the state.protected voidvalidateHierarchy(FacesContext context) Validate the component hierarchy.protected voidvalidateValue(FacesContext context, Object convertedValue) This override will server-side validate anyacceptandmaxsizefor each part.Methods inherited from class jakarta.faces.component.html.HtmlInputFile
addClientBehavior, getAccept, getAccesskey, getAlt, getAutocomplete, getDefaultEventName, getDir, getEventNames, getFamily, getLabel, getLang, getMaxlength, getOnblur, getOnchange, getOnclick, getOndblclick, getOnfocus, getOnkeydown, getOnkeypress, getOnkeyup, getOnmousedown, getOnmousemove, getOnmouseout, getOnmouseover, getOnmouseup, getOnselect, getRole, getSize, getStyle, getStyleClass, getTabindex, getTitle, isDisabled, isMultiple, isReadonly, setAccept, setAccesskey, setAlt, setAutocomplete, setDir, setDisabled, setLabel, setLang, setMaxlength, setMultiple, setOnblur, setOnchange, setOnclick, setOndblclick, setOnfocus, setOnkeydown, setOnkeypress, setOnkeyup, setOnmousedown, setOnmousemove, setOnmouseout, setOnmouseover, setOnmouseup, setOnselect, setReadonly, setRole, setSize, setStyle, setStyleClass, setTabindex, setTitle, setValueExpressionMethods inherited from class jakarta.faces.component.UIInput
addValidator, addValueChangeListener, broadcast, clearInitialState, compareValues, getConverterMessage, getRequiredMessage, getValidatorMessage, getValidators, getValue, getValueChangeListeners, isEmpty, isImmediate, isLocalValueSet, isRequired, isValid, markInitialState, processDecodes, processUpdates, processValidators, removeValidator, removeValueChangeListener, resetValue, restoreState, saveState, setConverterMessage, setImmediate, setLocalValueSet, setRequired, setRequiredMessage, setValid, setValidatorMessage, setValue, updateModel, validateMethods inherited from class jakarta.faces.component.UIOutput
getConverter, getLocalValue, setConverterMethods inherited from class jakarta.faces.component.UIComponentBase
addFacesListener, encodeAll, encodeBegin, encodeChildren, findComponent, getAttributes, getChildCount, getChildren, getClientBehaviors, getClientId, getFacesContext, getFacesListeners, getFacet, getFacetCount, getFacets, getFacetsAndChildren, getId, getParent, getPassThroughAttributes, getRenderer, getRendererType, getRendersChildren, invokeOnComponent, isRendered, isTransient, processRestoreState, processSaveState, queueEvent, removeFacesListener, restoreAttachedState, saveAttachedState, setId, setParent, setRendered, setRendererType, setTransient, visitTreeMethods inherited from class jakarta.faces.component.UIComponent
getClientId, getCompositeComponentParent, getContainerClientId, getCurrentComponent, getCurrentCompositeComponent, getListenersForEventClass, getNamingContainer, getPassThroughAttributes, getResourceBundleMap, getStateHelper, getStateHelper, getTransientStateHelper, getTransientStateHelper, getValueExpression, initialStateMarked, isCompositeComponent, isInView, isVisitable, popComponentFromEL, processEvent, pushComponentToEL, restoreTransientState, saveTransientState, setInView, subscribeToEvent, unsubscribeFromEventMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface jakarta.faces.component.behavior.ClientBehaviorHolder
getClientBehaviorsMethods inherited from interface jakarta.faces.component.ValueHolder
getConverter, getLocalValue, setConverter
-
Field Details
-
COMPONENT_TYPE
The component type, which is "org.omnifaces.component.input.InputFile".- See Also:
-
-
Constructor Details
-
InputFile
public InputFile()
-
-
Method Details
-
decode
This override checks if client side validation on maxsize has failed and if multi file upload is enabled. If client side validation on maxsize has failed, then it will render the message. If multi file upload is enabled, then it will set all parts as submitted value instead of only the last part as done in h:inputFile. -
getConvertedValue
This override will convert the individual parts if multi file upload is enabled and collect only non-null parts having a non-empty file name and a file size above zero.- Overrides:
getConvertedValuein classUIInput
-
validateValue
This override will server-side validate anyacceptandmaxsizefor each part.- Overrides:
validateValuein classHtmlInputFile
-
encodeEnd
This override will rendermultiple,directoryandacceptattributes accordingly. As thedirectoryattribute is relatively new, for better browser compatibility thewebkitdirectoryattribute will also be written along it.They're written as passthrough attributes because in Mojarra the
startElement()takes place inencodeEnd(FacesContext)instead ofUIComponentBase.encodeBegin(FacesContext).- Overrides:
encodeEndin classUIComponentBase- Throws:
IOException
-
validateHierarchy
Validate the component hierarchy. This should only be called when project stage isDevelopment.- Throws:
IllegalStateException- When component hierarchy is wrong.
-
getSubmittedValue
An override which ensures that the Faces implementation being used doesn't save it in the state. ThePartdoes namely not belong there.- Specified by:
getSubmittedValuein interfaceEditableValueHolder- Overrides:
getSubmittedValuein classUIInput
-
setSubmittedValue
An override which ensures that the Faces implementation being used doesn't save it in the state. ThePartdoes namely not belong there.- Specified by:
setSubmittedValuein interfaceEditableValueHolder- Overrides:
setSubmittedValuein classUIInput
-
isDirectory
public boolean isDirectory()Returns whether or not to enable directory selection.- Returns:
- Whether or not to enable directory selection.
-
setDirectory
public void setDirectory(boolean directory) Sets whether or not to enable directory selection. Whentrue, this implicitly defaults themultipleattribute totrue.- Parameters:
directory- Whether or not to enable directory selection.
-
getAcceptMessage
Returns validation message to be displayed when the condition inacceptattribute is violated.- Returns:
- Validation message to be displayed when the condition in
acceptattribute is violated.
-
setAcceptMessage
Sets validation message to be displayed when the condition inacceptattribute is violated.- Parameters:
acceptMessage- Validation message to be displayed when the condition inacceptattribute is violated.
-
getMaxsize
Returns maximum size in bytes for each selected file. This is validated in both client and server side.- Returns:
- Maximum size in bytes for each selected file.
-
setMaxsize
Sets maximum size in bytes for each selected file.- Parameters:
maxsize- Maximum size in bytes for each selected file.
-
getMaxsizeMessage
Returns validation message to be displayed when the condition inmaxsizeattribute is violated.- Returns:
- Validation message to be displayed when the condition in
maxsizeattribute is violated.
-
setMaxsizeMessage
Sets validation message to be displayed when the condition inmaxsizeattribute is violated.- Parameters:
maxsizeMessage- Validation message to be displayed when the condition inmaxsizeattribute is violated.
-