View Source

h1. File-Stream Processing Using FileEntryCallback

{attachments:fileentrycallback-tutorial.zip}
The all-new ACE FileEntry component introduces in-memory file processing. This feature is designed to provide for anti-virus scanning, validity checks or a scenario where the upload doesn't need to be saved and creating it on the disk may be excessive processing.

The component requires that a listener bean, FileEntryCallback, be created to handle the incrementally uploaded bytes. The contract that FileEntryCallbacks must implement is:

{code:java}
/* Notifies the file handler everytime a file begins uploading.
* fileInfo - information known about the file, before downloading the contents */
public void begin(FileEntryResults.FileInfo fileInfo);

/* We're working with chunks of bytes, as we read them in... */
public void write(byte[] buffer, int offset, int length);

/* We work with bytes, as we read them in... */
public void write(int data);

/* Should we decide to invalidate an upload, perhaps it's over quota, then this method
* must handle it for the callback. This method may massage the result (raising some
* prompts and accepting upload), or possibly fail the upload for good by calling
* FileEntryResults.FileInfo.updateStatus(FileEntryStatus, boolean status).
* fileInfo - The same object that was passed into begin(FileInfo)
*/
public void end(FileEntryResults.FileInfo fileInfo);
{code}

This example demos in-memory processing to provide an MD5 hash for files under 5mb, and a toy example of file handling.

{gallery}

\\
{panel}
* [*Implementing FileEntryCallback*|#interface]
* [*Adding the FileEntry Component to Facelet Page*|#addFileFacelet]
* [*Adding the "Quota Exceeded" Dialog*|#addQuotaFacelet]
{panel}
\\
----
h2. {anchor:interface}Implementing FileEntryCallback
\\
* Check fileInfo.getStatus() to determine if the file has pre-failed
* uploading, due to too many files uploaded, an invalid file extension,
* or content type.
Creating our handler is the most important step of this tutorial. Everything else is just wiring up the dependencies.

* h3. The {{begin}} Method
{code:title=FileEntryMD5Callback.java|borderStyle=solid}
public void begin(FileEntryResults.FileInfo fileInfo) {}
{code}

* h3. The {{write}} Methods
{code:title=FileEntryMD5Callback.java|borderStyle=solid}
public void write(byte[] buffer, int offset, int length) {}
public void write(int data) {}
{code}

* h3. The {{end}} Method
{code:title=FileEntryMD5Callback.java|borderStyle=solid}
// Some comments here
public void end(FileEntryResults.FileInfo fileInfo) {}
{code}

----
h2. {anchor:addFileFacelet}Adding the FileEntry Component to a Facelet Page
----
h2. {anchor:addQuotaFacelet}Adding the "Quota Exceeded" Dialog to a Facelet Page
----

That concludes this overview of the new in-memory processing feature. If you're interested in further details of how this example works, take a look at the complete source code below; or sign up for ICEfaces training for a complete guide to this example and every feature of ICEfaces!

{attachments:fileentrycallback-tutorial.zip}