JBoss.orgCommunity Documentation
The <rich:fileUpload> component is designed to perform Ajax-ed files upload to server.
ProgressBar shows the status of downloads
Restriction on File type, file size and number of files to be uploaded
Multiple files upload support
Embedded Flash module
Possibility to cancel the request
One request for every upload
Automatic uploads
Supports standard JSF internationalization
Highly customizable look and feel
Disablement support
The <rich:fileUpload> component consists of two parts:
List of files which contains the list of currently chosen files to upload with possibility to manage every file
Component controls - the bar with controls for managing the whole component
There are two places where the uploaded files are stored:
In the temporary folder (depends on OS) if the value of the
createTempFile
parameter in Ajax4jsf
Filter (in web.xml) section is "true" (by Default)
...
<init-param>
<param-name>createTempFiles</param-name>
<param-value>true</param-value>
</init-param>
...
In the RAM if the value of the createTempFile
parameter in
Ajax4jsf Filter section is "false".
This is a better way for storing small-sized files.
The "uploadData" attribute defines the collection of files uploaded. See the example below.
Example:
...
<rich:fileUpload uploadData="#{bean.data}"/>
...
The "fileUploadedListener" is called at server side after every file uploaded and used for the saving files from temporary folder or RAM.
Example:
...
<rich:fileUpload uploadData="#{bean.data}" fileUploadListener="#{bean.listener}"/>
...
The following methods for processing the uploaded files are available:
isMultiUpload()
. It returns "true" if several
files have been uploaded
getUploadItems()
. It returns the list of the uploaded files. If one
file was uploaded, the getUploadItems()
method will return the list
consisting of one file
getUploadItem()
. It returns the whole list in case of uploading one
file only. If several files were uploaded, the getUploadItem()
method will return the first element of the uploaded files list.
Automatically files uploading could be performed by means of the "immediateUpload" attribute. If the value of this attribute is "true" files are uploaded automatically once they have been added into the list. All next files in the list are uploaded automatically one by one. If you cancel uploading process next files aren't started to upload till you press the "Upload" button or clear the list.
Example:
...
<rich:fileUpload uploadData="#{bean.data}" fileUploadListener="#{bean.listener}" immediateUpload="true"/>
...
The "autoclear" attribute is used to remove automatically files from the list after upload completed. See the simple example below.
Example:
...
<rich:fileUpload uploadData="#{bean.data}" autoclear="true"/>
...
Each file in list waiting for upload has link "Cancel" opposite its name.
Clicking this link invokes JS API remove()
function, which gets $('id').component.entries[i]
as a parameter
and removes the particular file from list and from the queue for upload.
After a file has been uploaded the link "Cancel" changes to "Clear".
Clicking "Clear" invokes clear()
JS API function, which also gets ID of the particular entry and removes it from the list.
Uploaded to server file itself is kept untouched.
The <rich:fileUpload> component provides following restrictions:
On file types, use "acceptedTypes" attribute to define file types accepted by component. In the example below only files with "html" and "jpg" extensions are accepted to upload.
Example:
...
<rich:fileUpload acceptedTypes="html, jpg"/>
...
On file size, use the maxRequestSize
parameter(value in bytes) inside Ajax4jsf Filter section in
web.xml:
...
<init-param>
<param-name>maxRequestSize</param-name>
<param-value>1000000</param-value>
</init-param>
...
On max files quantity, use the "maxFilesQuantity" attribute to define max number of files allowed to be uploaded. After a number of files in the list equals to the value of this attribute "Add" button is disabled and nothing could be uploaded even if you clear the whole list. In order to upload files again you should rerender the component. As it could be seen in the example below, only 2 files are accepted for uploading.
Example:
...
<rich:fileUpload maxFilesQuantity="2"/>
...
This is the result:
The <rich:fileUpload> component provides a number of specific event attributes:
The "onadd" event handler called on an add file operation
The "onupload" which gives you a possibility to cancel the upload at client side
The "onuploadcomplete" which is called after all files from the list are uploaded
The "onuploadcanceled" which is called after upload has been canceled via cancel control
The "onerror" which is called if the file upload was interrupted according to any errors
The <rich:fileUpload> component has an embedded Flash module that adds extra functionality to the component. The module is enabled with "allowFlash" attribute set to "true".
These are the additional features that the Flash module provides:
Multiple files choosing;
Permitted file types are specified in the "Open File" dialog window;
A number of additional entry object properties are also available, which can be found RichFaces Developer Guide section on object properties.
Apart from uploading files to the sever without using Ajax, the Flash module provides a number of useful API functions that can be used to obtain information about the uploaded file.
There are 2 ways to obtain the data stored in the FileUploadEntry object.
By means of JavaScript on the client side. Use the following syntax for that
entries[i].propertyName
. For example
entries[0].state
will return the state of the file that is being
processed or has just been processed.
The properties of FileUploadEntry
object can be retrieved using
the entry.propertyName
expression in the specific event attributes.
For example,
onupload="alert(event.memo.entry.fileName);"
will display a message with the name of the file at the very moment when upload
operation starts. A full list of properties can be found in RichFaces Developer Guide section on properties and their attributes.
The given bellow code sample demonstrates how the properties can be used. Please study it carefully.
...
<head>
<script>
function _onaddHandler (e) {
var i = 0;
for (; i < e.memo.entries.lenght; i++) {
alert(e.memo.entries[i].creator); //Shows creators of the added files
}
}
function _onerrorhandle(e) {
alert(e.memo.entry.fileName + "file was not uploaded due transfer error");
}
</script>
</head>
...
Moreover, embedded Flash module provides a smoother representation of progress bar during the uploading process: the polling is performed is not by Ajax, but by means of the flash module.
However, the Flash module doesn't perform any visual representation of the component.
In order to customize the information regarding the ongoing process you could use "label" facet with the following macrosubstitution:
{B}
, {KB}
, {MB}
contains the size of
file uploaded in bytes, kilobytes, megabytes respectively
{_B}
, {_KB}
, {_MB}
contains the
remain file size to upload in bytes, kilobytes, megabytes respectively
{ss}
, {mm}
, {hh}
contains elapsed
time in seconds, minutes and hours respectively
Example:
...
<rich:fileUpload uploadData="#{bean.data}" fileUploadListener="#{bean.listener}">
<f:facet name="label">
<h:outputText value="{_KB}KB from {KB}KB uploaded --- {mm}:{ss}" />
</f:facet>
</rich:fileUpload>
...
This is the result:
You could define labels of the component controls with the help of "addControlLabel" , "clearAllControlLabel" , "clearControlLabel" , "stopEntryControlLabel" , "uploadControlLabel" attributes. See the following example.
Example:
...
<rich:fileUpload addControlLabel="Add file..." clearAllControlLabel="Clear all" clearControlLabel="Clear"
stopEntryControlLabel="Stop process" uploadControlLabel="Upload file"/>
...
This is the result:
The <rich:fileUpload> component allows to use sizes attributes:
"listHeight" attribute specifies a height for list of files in pixels
"listWidth" attribute specifies a width for list of files in pixels
In order to disable the whole component you could use the "disabled" attribute. See the following example.
Example:
...
<rich:fileUpload disabled="true"/>
...
This is the result:
It's possible to handle events for fileUpload using JavaScript code. A simplest example of JavaScript API usage is placed below:
Example:
...
<rich:fileUpload id="upload" disabled="false"/>
<h:commandButton onclick="${rich:component('upload')}.disable();" value="Disable" />
...
The
<rich:fileUpload>
component also provides a number of JavaScript properties, that can be used to
process uploaded files, file states etc. The given below example illustrates how the
entries[0].state
property can be used to get access to the file state.
Full list of JavaScript properties can be found below.
...
<rich:fileUpload fileUploadListener="#{fileUploadBean.listener}"
maxFilesQuantity="#{fileUploadBean.uploadsAvailable}"
id="upload"
immediateUpload="#{fileUploadBean.autoUpload}"
acceptedTypes="jpg, gif, png, bmp"/>
<a4j:support event="onuploadcomplete" reRender="info" />
</rich:fileUpload>
<h:commandButton onclick="if($('j_id232:upload').component.entries[0].state == FileUploadEntry.UPLOAD_SUCCESS) alert ('DONE');" value="Check file state"/>
...
The
<rich:fileUpload>
component allows to use internationalization method to redefine and localize
the labels. You could use application resource bundle and define
RICH_FILE_UPLOAD_CANCEL_LABEL
,
RICH_FILE_UPLOAD_STOP_LABEL
, RICH_FILE_UPLOAD_ADD_LABEL
,
RICH_FILE_UPLOAD_UPLOAD_LABEL
,
RICH_FILE_UPLOAD_CLEAR_LABEL
,
RICH_FILE_UPLOAD_CLEAR_ALL_LABEL
,
RICH_FILE_UPLOAD_PROGRESS_LABEL
,
RICH_FILE_UPLOAD_SIZE_ERROR_LABLE
,
RICH_FILE_UPLOAD_TRANSFER_ERROR_LABLE
,
RICH_FILE_UPLOAD_ENTRY_STOP_LABEL
,
RICH_FILE_UPLOAD_ENTRY_CLEAR_LABEL
,
RICH_FILE_UPLOAD_ENTRY_CANCEL_LABEL
there.
To make <rich:fileUpload> component work properly with MyFaces extensions, the order in which filters are defined and mapped in web.xml is important. See corresponding FAQ chapter.
Table of <rich:fileUpload> attributes.
Table 6.178. Component Identification Parameters
Name | Value |
---|---|
component-type | org.richfaces.component.FileUpload |
component-class | org.richfaces.component.html.HtmlFileUpload |
component-family | org.richfaces.component.FileUpload |
renderer-type | org.richfaces.renderkit.html.FileUploadRenderer |
tag-class | org.richfaces.taglib.FileUploadTag |
Table 6.179. JavaScript API
Function | Description |
---|---|
beforeSubmit() | Sets up necessary request parameters for file uploading and submits form to server by command button. This method should be used together with commands. |
clear() | Removes all files from the list. The function can also get the $('id').component.entries[i] as a parameter to remove a particular file. |
disable() | Disables the component |
enable() | Enables the component |
remove() | Cancels the request for uploading a file by removing this file from
upload list and upload queue. Gets $('id').component.entries[i] as a parameter. |
stop() | Stops the uploading process |
submitForm() | Submits form to server. All added files will be put to model and event. |
Table 6.180. Client-side object properties
Property | Description |
---|---|
entries | Returns a array of all files in the list |
entries.length | Returns the number of files in the list |
entries[i].fileName | Returns the file name, that is retrieved by the array index |
entries[i].state | Returns the file state. Possible states are
|
entries[i].size | Returns the size of the file. Available in flash enabled version only |
entries[i].Type | Returns the mime type of the file. Available in flash enabled version only |
entries[i].creator | Returns the name of the author of the file. Available in flash enabled version only |
entries[i].creationDate | Returns the date when the file was created. Available in flash enabled version only |
entries[i].modificationDate | Returns the date of the last file modification. Available in flash enabled version only |
Table 6.181. Client-side object properties available with specific event attributes
Property | Description |
---|---|
entry.state | Returns the file state. Possible states are
|
entry.fileName | Returns the file's name. This property works with all event handlers except for "onadd". |
entry.size | Returns the size of the file. Available in flash enabled version only |
entry.Type | Returns the mime type of the file. Available in flash enabled version only |
entry.creator | Returns the name of the author of the file. Available in flash enabled version only |
entry.creationDate | Returns the date when the file was created. Available in flash enabled version only |
entry.modificationDate | Returns the date of the last file modification. Available in flash enabled version only |
Table 6.182. Facets
Facet name | Description |
---|---|
label | Defines the information regarding the ongoing process |
progress | Defines the information regarding the uploading process |
Table 6.183. Style classes (selectors) with the corresponding skin parameters
Class (selector) name | Description | Skin Parameter | CSS properties mapped |
---|---|---|---|
.rich-fileupload-font | Defines styles for a font of buttons and items | generalFamilyFont | font-family |
generalSizeFont | font-size | ||
.rich-fileupload-table-td | Defines styles for the <td> elements of the added item | tableBorderColor | border-bottom-color |
.rich-fileupload-list-decor | Defines styles for a wrapper <div> element of a fileUpload | tableBorderColor | border-color |
tableBackgroundColor | background-color | ||
.rich-fileupload-anc | Defines styles for the "Cancel", "Stop", "Clear" links | generalLinkColor | color |
.rich-fileupload-toolbar-decor | Defines styles for a toolbar | additionalBackgroundColor | background-color |
tableBorderColor | border-bottom-color | ||
tableBackgroundColor | border-top-color, border-left-color | ||
.rich-fileupload-button-border | Defines styles for a border of buttons | tableBorderColor | border-color |
.rich-fileupload-enrty-dis | Defines styles for a disabled entry | trimColor | background-color |
.rich-fileupload-button-content | Defines styles for the buttons content | generalTextColor | color |
.rich-fileupload-button | Defines styles for a buttons | trimColor | background-color |
.rich-fileupload-button-light | Defines styles for a highlight of button | trimColor | background-color |
selectControlColor | border-color | ||
.rich-fileupload-button-press | Defines styles for a pressed button | selectControlColor | border-color |
additionalBackgroundColor | background-color | ||
.rich-fileupload-ico-add-dis | Defines styles for a disabled "Add" button icon | tableBorderColor | color |
.rich-fileupload-ico-start-dis | Defines styles for a disabled "Upload" button icon | tableBorderColor | color |
.rich-fileupload-ico-clear-dis | Defines styles for a disabled "Clear" button icon | tableBorderColor | color |
Table 6.184. Style classes (selectors) without skin parameters
Class name | Description |
---|---|
rich-fileupload-list-overflow | Defines styles for a list of files |
rich-fileupload-button-dis | Defines styles for a disabled button |
rich-fileupload-button-selection | Defines styles for "Upload", "Clean" buttons |
rich-fileupload-ico | Defines styles for an icon |
rich-fileupload-ico-add | Defines styles for a "Add" button icon |
rich-fileupload-ico-start | Defines styles for a "Upload" button icon |
rich-fileupload-ico-stop | Defines styles for a "Stop" button icon |
rich-fileupload-ico-clear | Defines styles for a "Clear" button icon |
rich-fileupload-table-td | Defines styles for a wrapper <td> element of a list items |
You can find all necessary information about style classes redefinition in Definition of Custom Style Classes section.
On RichFaces LiveDemo page you can see an example of <rich:fileUpload> usage and sources for the given example.
<rich:fileUpload> with MyFaces article describes how to avoid problems with <rich:fileUpload> compenent caused by wrong application configuration.