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.
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.
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.
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();
// ...
}
}
}
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.
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!
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!
| Info | Value |
|---|---|
| Component Type | org.omnifaces.component.input.InputFile |
| Handler Class | None |
| Renderer Type | None |
| Description | None |
| Name | Required | Type | Description |
|---|---|---|---|
accept | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Comma separated string of mime types of files to filter in client side file browse dialog. Note: this is not validated in server side. |
acceptMessage | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Validation message to be displayed when the condition in accept attribute is violated. |
accesskey | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| No Description |
binding | false | jakarta.el.ValueExpression
(must evaluate to jakarta.faces.component.UIComponent)
| The ValueExpression linking this component to a property in a backing bean. |
converter | false | jakarta.el.ValueExpression
(must evaluate to jakarta.faces.convert.Converter)
| Converter instance registered with this component. |
converterMessage | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| A ValueExpression enabled attribute that, if present, will be used as the text of the converter message, replacing any message that comes from the converter. |
dir | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Direction indication for text that does not inherit directionality. Valid values are "LTR" (left-to-right) and "RTL" (right-to-left). These attributes are case sensitive when rendering to XHTML, so care must be taken to have the correct case. |
directory | false | jakarta.el.ValueExpression
(must evaluate to boolean)
| Whether or not to enable directory selection.
When true, this implicitly defaults the multiple attribute to true. |
disabled | false | jakarta.el.ValueExpression
(must evaluate to boolean)
| Flag indicating that this element must never receive focus or be included in a subsequent submit. A value of false causes no attribute to be rendered, while a value of true causes the attribute to be rendered as disabled="disabled". |
id | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| The component identifier for this component. This value must be unique within the closest parent component that is a naming container. |
immediate | false | jakarta.el.ValueExpression
(must evaluate to boolean)
| Flag indicating that this component's value must be converted and validated immediately (that is, during Apply Request Values phase), rather than waiting until Process Validations phase. |
label | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| A localized user presentable name for this component. |
lang | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Code describing the language used in the generated markup for this component. |
maxsize | false | jakarta.el.ValueExpression
(must evaluate to java.lang.Long)
| Maximum size in bytes for each selected file. |
maxsizeMessage | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Validation message to be displayed when the condition in maxsize attribute is violated. |
multiple | false | jakarta.el.ValueExpression
(must evaluate to boolean)
| Flag indicating that this element must allow multiple file selection. A value of false causes no attribute to be rendered, while a value of true causes the attribute to be rendered as multiple="multiple". |
onblur | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when this element loses focus. |
onchange | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when this element loses focus and its value has been modified since gaining focus. |
onclick | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when a pointer button is clicked over this element. |
ondblclick | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when a pointer button is double clicked over this element. |
onfocus | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when this element receives focus. |
onkeydown | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when a key is pressed down over this element. |
onkeypress | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when a key is pressed and released over this element. |
onkeyup | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when a key is released over this element. |
onmousedown | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when a pointer button is pressed down over this element. |
onmousemove | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when a pointer button is moved within this element. |
onmouseout | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when a pointer button is moved away from this element. |
onmouseover | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when a pointer button is moved onto this element. |
onmouseup | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when a pointer button is released over this element. |
onselect | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Javascript code executed when text within this element is selected by the user. |
rendered | false | jakarta.el.ValueExpression
(must evaluate to boolean)
| Flag indicating whether or not this component should be rendered (during Render Response Phase), or processed on any subsequent form submit. The default value for this property is true. |
required | false | jakarta.el.ValueExpression
(must evaluate to boolean)
| Flag indicating that the user is required to provide a submitted value for this input component. |
requiredMessage | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| A ValueExpression enabled attribute that, if present, will be used as the text of the validation message for the "required" facility, if the "required" facility is used. |
role | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Per the WAI-ARIA spec and its relationship to HTML5 (Section title ARIA Role Attriubute), every HTML element may have a "role" attribute whose value must be passed through unmodified on the element on which it is declared in the final rendered markup. The attribute, if specified, must have a value that is a string literal that is, or an EL Expression that evaluates to, a set of space-separated tokens representing the various WAI-ARIA roles that the element belongs to. It is the page author's responsibility to ensure that the user agent is capable of correctly interpreting the value of this attribute. |
style | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| CSS style(s) to be applied when this component is rendered. |
styleClass | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Space-separated list of CSS style class(es) to be applied when this element is rendered. This value must be passed through as the "class" attribute on generated markup. |
tabindex | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Position of this element in the tabbing order for the current document. This value must be an integer between 0 and 32767. |
title | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| Advisory title information about markup elements generated for this component. |
validator | false | jakarta.el.MethodExpression
(signature must match void validate(jakarta.faces.context.FacesContext, jakarta.faces.component.UIComponent, java.lang.Object))
| MethodExpression representing a validator method that will be called during Process Validations to perform correctness checks on the value of this component. The expression must evaluate to a public method that takes FacesContext, UIComponent, and Object parameters, with a return type of void. |
validatorMessage | false | jakarta.el.ValueExpression
(must evaluate to java.lang.String)
| No Description |
value | false | jakarta.el.ValueExpression
(must evaluate to java.lang.Object)
| The current value of this component. If the multiple attribute is set to true, then this must be assignable to java.util.Collection<jakarta.servlet.http.Part>, else this must be assignable to jakarta.servlet.http.Part. |
valueChangeListener | false | jakarta.el.MethodExpression
(signature must match void valueChange(jakarta.faces.event.ValueChangeEvent))
| MethodExpression representing a value change listener method that will be notified when a new value has been set for this input component. The expression must evaluate to a public method that takes a ValueChangeEvent parameter, with a return type of void, or to a public method that takes no arguments with a return type of void. |
Output generated by Vdldoc View Declaration Language Documentation Generator.