Why Streaming?
The traditional API, which is described in the User
Guide, assumes that file items must be stored somewhere before
they are actually accessable by the user. This approach is convenient,
because it allows easy access to an items contents. On the other hand,
it is memory and time consuming.
The streaming API allows you to trade a little bit of convenience for
optimal performance and a low memory profile. Additionally, the
API is more lightweight, thus easier to understand.
How it works
Again, the FileUpload class is used for accessing the
form fields and fields in the order in which they have been sent
by the client. However, the FileItemFactory is completely
ignored.
Parsing the request
First of all, do not forget to ensure that a request actually is a
a file upload request. This is typically done using the same static
method, which you already know from the traditional API.
// Check that we have a file upload request
boolean isMultipart = JakartaServletFileUpload.isMultipartContent(request);
Now we are ready to parse the request into its constituent items. Here's
how we do it:
// Create a new file upload handler
import java.nio.charset.Charset;
import org.apache.commons.io.IOUtils;
JakartaServletFileUpload upload = new JakartaServletFileUpload();
// Parse the request
upload.getItemIterator(request).forEachRemaining(item -> {
String name = item.getFieldName();
InputStream stream = item.getInputStream();
if (item.isFormField()) {
System.out.println("Form field " + name + " with value "
+ IOUtils.toString(stream, Charset.defaultCharset()) + " detected.");
} else {
System.out.println("File field " + name + " with file name "
+ item.getName() + " detected.");
// Process the input stream
...
}
});
That's all that's needed. Really!
|