You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by gi...@apache.org on 2022/04/02 08:10:14 UTC

[struts-site] branch asf-site updated: Automatic Site Publish by Buildbot

This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/struts-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 67f8d6c  Automatic Site Publish by Buildbot
67f8d6c is described below

commit 67f8d6cf6accc1b76ab3db9915d7040b38856cc7
Author: buildbot <us...@infra.apache.org>
AuthorDate: Sat Apr 2 08:10:13 2022 +0000

    Automatic Site Publish by Buildbot
---
 output/core-developers/file-upload.html | 611 ++++++++++++--------------------
 1 file changed, 220 insertions(+), 391 deletions(-)

diff --git a/output/core-developers/file-upload.html b/output/core-developers/file-upload.html
index 5bf597a..c1723f0 100644
--- a/output/core-developers/file-upload.html
+++ b/output/core-developers/file-upload.html
@@ -1,175 +1,21 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="UTF-8"/>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
-  <meta name="Date-Revision-yyyymmdd" content="20140918"/>
-  <meta http-equiv="Content-Language" content="en"/>
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-
-  <title>File Upload</title>
-
-  <link href="//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,400italic,600italic,700italic" rel="stylesheet" type="text/css">
-  <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
-  <link href="/css/main.css" rel="stylesheet">
-  <link href="/css/custom.css" rel="stylesheet">
-  <link href="/highlighter/github-theme.css" rel="stylesheet">
-
-  <script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
-  <script type="text/javascript" src="/bootstrap/js/bootstrap.js"></script>
-  <script type="text/javascript" src="/js/community.js"></script>
-</head>
-<body>
-
-<a href="http://github.com/apache/struts" class="github-ribbon">
-  <img style="position: absolute; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png" alt="Fork me on GitHub">
-</a>
-
-<header>
-  <nav>
-    <div role="navigation" class="navbar navbar-default navbar-fixed-top">
-      <div class="container">
-        <div class="navbar-header">
-          <button type="button" data-toggle="collapse" data-target="#struts-menu" class="navbar-toggle">
-            Menu
-            <span class="sr-only">Toggle navigation</span>
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-          </button>
-          <a href="/index.html" class="navbar-brand logo"><img src="/img/struts-logo.svg"></a>
-        </div>
-        <div id="struts-menu" class="navbar-collapse collapse">
-          <ul class="nav navbar-nav">
-            <li class="dropdown">
-              <a data-toggle="dropdown" href="#" class="dropdown-toggle">
-                Home<b class="caret"></b>
-              </a>
-              <ul class="dropdown-menu">
-                <li><a href="/index.html">Welcome</a></li>
-                <li><a href="/download.cgi">Download</a></li>
-                <li><a href="/releases.html">Releases</a></li>
-                <li><a href="/announce-2022.html">Announcements</a></li>
-                <li><a href="http://www.apache.org/licenses/">License</a></li>
-                <li><a href="https://www.apache.org/foundation/thanks.html">Thanks!</a></li>
-                <li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
-              </ul>
-            </li>
-            <li class="dropdown">
-              <a data-toggle="dropdown" href="#" class="dropdown-toggle">
-                Support<b class="caret"></b>
-              </a>
-              <ul class="dropdown-menu">
-                <li><a href="/mail.html">User Mailing List</a></li>
-                <li><a href="https://issues.apache.org/jira/browse/WW">Issue Tracker</a></li>
-                <li><a href="/security.html">Reporting Security Issues</a></li>
-                <li class="divider"></li>
-                <li><a href="https://cwiki.apache.org/confluence/display/WW/Migration+Guide">Version Notes</a></li>
-                <li><a href="https://cwiki.apache.org/confluence/display/WW/Security+Bulletins">Security Bulletins</a></li>
-                <li class="divider"></li>
-                <li><a href="/maven/project-info.html">Maven Project Info</a></li>
-                <li><a href="/maven/struts2-core/dependencies.html">Struts Core Dependencies</a></li>
-                <li><a href="/maven/struts2-plugins/modules.html">Plugin Dependencies</a></li>
-              </ul>
-            </li>
-            <li class="dropdown">
-              <a data-toggle="dropdown" href="#" class="dropdown-toggle">
-                Documentation<b class="caret"></b>
-              </a>
-              <ul class="dropdown-menu">
-                <li><a href="/birdseye.html">Birds Eye</a></li>
-                <li><a href="/primer.html">Key Technologies</a></li>
-                <li><a href="/kickstart.html">Kickstart FAQ</a></li>
-                <li><a href="https://cwiki.apache.org/confluence/display/WW/Home">Wiki</a></li>
-                <li class="divider"></li>
-                <li><a href="/getting-started/">Getting Started</a></li>
-                <li><a href="/security/">Security Guide</a></li>
-                <li><a href="/core-developers/">Core Developers Guide</a></li>
-                <li><a href="/tag-developers/">Tag Developers Guide</a></li>
-                <li><a href="/maven-archetypes/">Maven Archetypes</a></li>
-                <li><a href="/plugins/">Plugins</a></li>
-                <li><a href="/maven/struts2-core/apidocs/index.html">Struts Core API</a></li>
-                <li><a href="/tag-developers/tag-reference.html">Tag reference</a></li>
-                <li><a href="https://cwiki.apache.org/confluence/display/WW/FAQs">FAQs</a></li>
-                <li><a href="http://cwiki.apache.org/S2PLUGINS/home.html">Plugin registry</a></li>
-              </ul>
-            </li>
-            <li class="dropdown">
-              <a data-toggle="dropdown" href="#" class="dropdown-toggle">
-                Contributing<b class="caret"></b>
-              </a>
-              <ul class="dropdown-menu">
-                <li><a href="/youatstruts.html">You at Struts</a></li>
-                <li><a href="/helping.html">How to Help FAQ</a></li>
-                <li><a href="/dev-mail.html">Development Lists</a></li>
-                <li class="divider"></li>
-                <li><a href="/submitting-patches.html">Submitting patches</a></li>
-                <li><a href="/builds.html">Source Code and Builds</a></li>
-                <li><a href="/coding-standards.html">Coding standards</a></li>
-                <li><a href="/contributors/">Contributors Guide</a></li>
-                <li class="divider"></li>
-                <li><a href="/release-guidelines.html">Release Guidelines</a></li>
-                <li><a href="/bylaws.html">PMC Charter</a></li>
-                <li><a href="/volunteers.html">Volunteers</a></li>
-                <li><a href="https://gitbox.apache.org/repos/asf?p=struts.git">Source Repository</a></li>
-                <li><a href="/updating-website.html">Updating the website</a></li>
-              </ul>
-            </li>
-            <li class="apache"><a href="http://www.apache.org/"><img src="/img/apache.png"></a></li>
-          </ul>
-        </div>
-      </div>
-    </div>
-  </nav>
-</header>
-
-
-<article class="container">
-  <section class="col-md-12">
-    <a href="index.html" title="back to Core Developers Guide"><< back to Core Developers Guide</a>
-    <a class="edit-on-gh" href="https://github.com/apache/struts-site/edit/master/source/core-developers/file-upload.md" title="Edit this page on GitHub">Edit on GitHub</a>
-    <h1 class="no_toc" id="file-upload">File Upload</h1>
-
-<ul id="markdown-toc">
-  <li><a href="#dependencies" id="markdown-toc-dependencies">Dependencies</a>    <ul>
-      <li><a href="#struts-20x-file-upload-dependencies" id="markdown-toc-struts-20x-file-upload-dependencies">Struts 2.0.x File Upload Dependencies</a></li>
-      <li><a href="#struts-21x-file-upload-dependencies" id="markdown-toc-struts-21x-file-upload-dependencies">Struts 2.1.x File Upload Dependencies</a></li>
-    </ul>
-  </li>
-  <li><a href="#basic-usage" id="markdown-toc-basic-usage">Basic Usage</a>    <ul>
-      <li><a href="#example-action-mapping" id="markdown-toc-example-action-mapping">Example action mapping:</a></li>
-      <li><a href="#example-jsp-form-tags" id="markdown-toc-example-jsp-form-tags">Example JSP form tags:</a></li>
-      <li><a href="#example-action-class" id="markdown-toc-example-action-class">Example Action class:</a></li>
-    </ul>
-  </li>
-  <li><a href="#uploading-multiple-files" id="markdown-toc-uploading-multiple-files">Uploading Multiple Files</a>    <ul>
-      <li><a href="#uploading-multiple-files-using-arrays" id="markdown-toc-uploading-multiple-files-using-arrays">Uploading Multiple Files using Arrays</a></li>
-      <li><a href="#uploading-multiple-files-using-lists" id="markdown-toc-uploading-multiple-files-using-lists">Uploading Multiple Files using Lists</a></li>
-    </ul>
-  </li>
-  <li><a href="#advanced-configuration" id="markdown-toc-advanced-configuration">Advanced Configuration</a>    <ul>
-      <li><a href="#file-size-limits" id="markdown-toc-file-size-limits">File Size Limits</a></li>
-      <li><a href="#file-types" id="markdown-toc-file-types">File Types</a></li>
-      <li><a href="#error-messages" id="markdown-toc-error-messages">Error Messages</a></li>
-      <li><a href="#temporary-directories" id="markdown-toc-temporary-directories">Temporary Directories</a></li>
-      <li><a href="#alternate-libraries" id="markdown-toc-alternate-libraries">Alternate Libraries</a></li>
-      <li><a href="#request-validation" id="markdown-toc-request-validation">Request validation</a></li>
-      <li><a href="#disabling-file-upload-support" id="markdown-toc-disabling-file-upload-support">Disabling file upload support</a></li>
-    </ul>
-  </li>
+<h1 id="file-upload">File Upload</h1>
+
+<ul class="no_toc">
+  <li>Will be replaced with the ToC, excluding a header {:toc}</li>
 </ul>
 
-<p>The Struts 2 framework provides built-in support for processing file uploads that conform to <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>, 
-“Form-based File Upload in HTML”. When correctly configured the framework will pass uploaded file(s) into your Action class. 
-Support for individual and multiple file uploads are provided. When a file is uploaded it will typically be stored in a temporary directory. 
-Uploaded files should be processed or moved by your Action class to ensure the data is not lost. Be aware that servers may have a security 
-policy in place that prohibits you from writing to directories other than the temporary directory and the directories that belong to your 
-web application.</p>
+<p>The Struts 2 framework provides built-in support for processing file uploads that conform
+to <a href="http://www.ietf.org/rfc/rfc1867.txt">RFC 1867</a>,
+“Form-based File Upload in HTML”. When correctly configured the framework will pass uploaded file(s) into your Action
+class. Support for individual and multiple file uploads are provided. When a file is uploaded it will typically be
+stored in a temporary directory. Uploaded files should be processed or moved by your Action class to ensure the data is
+not lost. Be aware that servers may have a security policy in place that prohibits you from writing to directories other
+than the temporary directory and the directories that belong to your web application.</p>
 
 <h2 id="dependencies">Dependencies</h2>
 
-<p>The Struts 2 framework leverages add-on libraries to handle the parsing of uploaded files. These libraries are not included in the Struts 
-distribution, you must add them into your project. The libraries needed are:</p>
+<p>The Struts 2 framework leverages add-on libraries to handle the parsing of uploaded files. These libraries are not
+included in the Struts distribution, you must add them into your project. The libraries needed are:</p>
 
 <table>
   <thead>
@@ -231,9 +77,9 @@ distribution, you must add them into your project. The libraries needed are:</p>
 
 <h2 id="basic-usage">Basic Usage</h2>
 
-<p>The <code class="highlighter-rouge">org.apache.struts2.interceptor.FileUploadInterceptor</code> class is included as part of the <code class="highlighter-rouge">defaultStack</code>. As long as the required libraries 
-are added to your project you will be able to take advantage of of the Struts 2 fileUpload capability. Configure an Action mapping for your 
-Action class as you typically would.</p>
+<p>The <code class="highlighter-rouge">org.apache.struts2.interceptor.FileUploadInterceptor</code> class is included as part of the <code class="highlighter-rouge">defaultStack</code>. As long as
+the required libraries are added to your project you will be able to take advantage of of the Struts 2 fileUpload
+capability. Configure an Action mapping for your Action class as you typically would.</p>
 
 <h3 id="example-action-mapping">Example action mapping:</h3>
 
@@ -243,55 +89,57 @@ Action class as you typically would.</p>
 
 </code></pre></div></div>
 
-<p>A form must be create with a form field of type file, <code class="highlighter-rouge">&lt;INPUT type="file" name="upload"&gt;</code>. The form used to upload the file must have its 
-encoding type set to <code class="highlighter-rouge">multipart/form-data</code>, <code class="highlighter-rouge">&lt;form action="doUpload" enctype="multipart/form-data" method="post"&gt;</code>. The standard procedure 
-for adding these elements is by using the Struts 2 tag libraries as shown in the following example:</p>
+<p>A form must be create with a form field of type file, <code class="highlighter-rouge">&lt;INPUT type="file" name="upload"&gt;</code>. The form used to upload the
+file must have its encoding type set to <code class="highlighter-rouge">multipart/form-data</code>
+, <code class="highlighter-rouge">&lt;form action="doUpload" enctype="multipart/form-data" method="post"&gt;</code>. The standard procedure for adding these
+elements is by using the Struts 2 tag libraries as shown in the following example:</p>
 
 <h3 id="example-jsp-form-tags">Example JSP form tags:</h3>
 
-<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>   <span class="nt">&lt;s:form</span> <span class="na">action=</span><span class="s">"doUpload"</span> <span class="na">method=</span><span class="s">"post"</span> <span class="na">enctype=</span><span class="s">"multipart/form-data"</span><span class="nt">&gt;</span>
-       <span class="nt">&lt;s:file</span> <span class="na">name=</span><span class="s">"upload"</span> <span class="na">label=</span><span class="s">"File"</span><span class="nt">/&gt;</span>
-       <span class="nt">&lt;s:submit/&gt;</span>
-   <span class="nt">&lt;/s:form&gt;</span>
+<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;s:form</span> <span class="na">action=</span><span class="s">"doUpload"</span> <span class="na">method=</span><span class="s">"post"</span> <span class="na">enctype=</span><span class="s">"multipart/form-data"</span><span class="nt">&gt;</span>
+    <span class="nt">&lt;s:file</span> <span class="na">name=</span><span class="s">"upload"</span> <span class="na">label=</span><span class="s">"File"</span><span class="nt">/&gt;</span>
+    <span class="nt">&lt;s:submit/&gt;</span>
+<span class="nt">&lt;/s:form&gt;</span>
 </code></pre></div></div>
 
-<p>The fileUpload interceptor will use setter injection to insert the uploaded file and related data into your Action class. For a form field 
-named <code class="highlighter-rouge">upload</code> you would provide the three setter methods shown in the following example:</p>
+<p>The fileUpload interceptor will use setter injection to insert the uploaded file and related data into your Action
+class. For a form field named <code class="highlighter-rouge">upload</code> you would provide the three setter methods shown in the following example:</p>
 
 <h3 id="example-action-class">Example Action class:</h3>
 
 <div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">package</span> <span class="n">com</span><span class="o">.</span><span class="na">example</span><span class="o">;</span>
 
-   <span class="kn">import</span> <span class="nn">java.io.File</span><span class="o">;</span>
-   <span class="kn">import</span> <span class="nn">com.opensymphony.xwork2.ActionSupport</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">java.io.File</span><span class="o">;</span>
 
-   <span class="kd">public</span> <span class="kd">class</span> <span class="nc">UploadAction</span> <span class="kd">extends</span> <span class="n">ActionSupport</span> <span class="o">{</span>
-      <span class="kd">private</span> <span class="n">File</span> <span class="n">file</span><span class="o">;</span>
-      <span class="kd">private</span> <span class="n">String</span> <span class="n">contentType</span><span class="o">;</span>
-      <span class="kd">private</span> <span class="n">String</span> <span class="n">filename</span><span class="o">;</span>
+<span class="kn">import</span> <span class="nn">com.opensymphony.xwork2.ActionSupport</span><span class="o">;</span>
 
-      <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUpload</span><span class="o">(</span><span class="n">File</span> <span class="n">file</span><span class="o">)</span> <span class="o">{</span>
-         <span class="k">this</span><span class="o">.</span><span class="na">file</span> <span class="o">=</span> <span class="n">file</span><span class="o">;</span>
-      <span class="o">}</span>
+<span class="kd">public</span> <span class="kd">class</span> <span class="nc">UploadAction</span> <span class="kd">extends</span> <span class="n">ActionSupport</span> <span class="o">{</span>
+    <span class="kd">private</span> <span class="n">File</span> <span class="n">file</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">contentType</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="n">String</span> <span class="n">filename</span><span class="o">;</span>
 
-      <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUploadContentType</span><span class="o">(</span><span class="n">String</span> <span class="n">contentType</span><span class="o">)</span> <span class="o">{</span>
-         <span class="k">this</span><span class="o">.</span><span class="na">contentType</span> <span class="o">=</span> <span class="n">contentType</span><span class="o">;</span>
-      <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUpload</span><span class="o">(</span><span class="n">File</span> <span class="n">file</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">file</span> <span class="o">=</span> <span class="n">file</span><span class="o">;</span>
+    <span class="o">}</span>
 
-      <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUploadFileName</span><span class="o">(</span><span class="n">String</span> <span class="n">filename</span><span class="o">)</span> <span class="o">{</span>
-         <span class="k">this</span><span class="o">.</span><span class="na">filename</span> <span class="o">=</span> <span class="n">filename</span><span class="o">;</span>
-      <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUploadContentType</span><span class="o">(</span><span class="n">String</span> <span class="n">contentType</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">contentType</span> <span class="o">=</span> <span class="n">contentType</span><span class="o">;</span>
+    <span class="o">}</span>
 
-      <span class="kd">public</span> <span class="n">String</span> <span class="nf">execute</span><span class="o">()</span> <span class="o">{</span>
-         <span class="c1">//...</span>
-         <span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
-      <span class="o">}</span>
- <span class="o">}</span>
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUploadFileName</span><span class="o">(</span><span class="n">String</span> <span class="n">filename</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">filename</span> <span class="o">=</span> <span class="n">filename</span><span class="o">;</span>
+    <span class="o">}</span>
 
+    <span class="kd">public</span> <span class="n">String</span> <span class="nf">execute</span><span class="o">()</span> <span class="o">{</span>
+        <span class="c1">//...</span>
+        <span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
+    <span class="o">}</span>
+<span class="o">}</span>
 </code></pre></div></div>
 
-<p>The purpose of each one of these methods is described in the table below. Notice that if you have multiple file form elements with different 
-names you would be required to have another corresponding set of these methods for each file uploaded.</p>
+<p>The purpose of each one of these methods is described in the table below. Notice that if you have multiple file form
+elements with different names you would be required to have another corresponding set of these methods for each file
+uploaded.</p>
 
 <table>
   <thead>
@@ -318,66 +166,73 @@ names you would be required to have another corresponding set of these methods f
 
 <h2 id="uploading-multiple-files">Uploading Multiple Files</h2>
 
-<p>As mentioned in the previous section one technique for uploading multiple files would be to simply have multiple form input elements of type 
-file all with different names. This would require a number of setter methods that was equal to 3 times the number of files being uploaded. 
-Another option is to use Arrays or java.util.Lists. The following examples are taken from the Showcase example application that is part 
-sample applications you can download at <a href="http://struts.apache.org/download.cgi">http://struts.apache.org/download.cgi</a>. For the Action mapping 
-details see <code class="highlighter-rouge">struts-fileupload.xml</code> in the sample application download.</p>
+<p>As mentioned in the previous section one technique for uploading multiple files would be to simply have multiple form
+input elements of type file all with different names. This would require a number of setter methods that was equal to 3
+times the number of files being uploaded. Another option is to use Arrays or java.util.Lists. The following examples are
+taken from the Showcase example application that is part sample applications you can download
+at <a href="http://struts.apache.org/download.cgi">http://struts.apache.org/download.cgi</a>. For the Action mapping details
+see <code class="highlighter-rouge">struts-fileupload.xml</code> in the sample application download.</p>
 
 <h3 id="uploading-multiple-files-using-arrays">Uploading Multiple Files using Arrays</h3>
 
 <p><code class="highlighter-rouge">multipleUploadUsingArray.jsp</code> Notice all file input types have the same name.</p>
 
-<pre><code class="language-jsp">&lt;s:form action="doMultipleUploadUsingArray" method="POST" enctype="multipart/form-data"&gt;
-  &lt;s:file label="File (1)" name="upload" /&gt;
-  &lt;s:file label="File (2)" name="upload" /&gt;
-  &lt;s:file label="FIle (3)" name="upload" /&gt;
-  &lt;s:submit cssClass="btn btn-primary"/&gt;
-&lt;/s:form&gt;
-</code></pre>
+<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;s:form</span> <span class="na">action=</span><span class="s">"doMultipleUploadUsingArray"</span> <span class="na">method=</span><span class="s">"POST"</span> <span class="na">enctype=</span><span class="s">"multipart/form-data"</span><span class="nt">&gt;</span>
+  <span class="nt">&lt;s:file</span> <span class="na">label=</span><span class="s">"File (1)"</span> <span class="na">name=</span><span class="s">"upload"</span> <span class="nt">/&gt;</span>
+  <span class="nt">&lt;s:file</span> <span class="na">label=</span><span class="s">"File (2)"</span> <span class="na">name=</span><span class="s">"upload"</span> <span class="nt">/&gt;</span>
+  <span class="nt">&lt;s:file</span> <span class="na">label=</span><span class="s">"FIle (3)"</span> <span class="na">name=</span><span class="s">"upload"</span> <span class="nt">/&gt;</span>
+  <span class="nt">&lt;s:submit</span> <span class="na">cssClass=</span><span class="s">"btn btn-primary"</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;/s:form&gt;</span>
+</code></pre></div></div>
 
 <p><code class="highlighter-rouge">MultipleFileUploadUsingArrayAction.java</code></p>
 
 <div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MultipleFileUploadUsingArrayAction</span> <span class="kd">extends</span> <span class="n">ActionSupport</span> <span class="o">{</span>
-	<span class="kd">private</span> <span class="n">File</span><span class="o">[]</span> <span class="n">uploads</span><span class="o">;</span>
-	<span class="kd">private</span> <span class="n">String</span><span class="o">[]</span> <span class="n">uploadFileNames</span><span class="o">;</span>
-	<span class="kd">private</span> <span class="n">String</span><span class="o">[]</span> <span class="n">uploadContentTypes</span><span class="o">;</span>
-
-	<span class="kd">public</span> <span class="n">String</span> <span class="nf">upload</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
-		<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"\n\n upload2"</span><span class="o">);</span>
-		<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"files:"</span><span class="o">);</span>
-		<span class="k">for</span> <span class="o">(</span><span class="n">File</span> <span class="n">u</span> <span class="o">:</span> <span class="n">uploads</span><span class="o">)</span> <span class="o">{</span>
-			<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"*** "</span> <span class="o">+</span> <span class="n">u</span> <span class="o">+</span> <span class="s">"\t"</span> <span class="o">+</span> <span class="n">u</span><span class="o">.</span><span class="na">length</span><span class="o">());</span>
-		<span class="o">}</span>
-		<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"filenames:"</span><span class="o">);</span>
-		<span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">n</span> <span class="o">:</span> <span class="n">uploadFileNames</span><span class="o">)</span> <span class="o">{</span>
-			<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"*** "</span> <span class="o">+</span> <span class="n">n</span><span class="o">);</span>
-		<span class="o">}</span>
-		<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"content types:"</span><span class="o">);</span>
-		<span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">c</span> <span class="o">:</span> <span class="n">uploadContentTypes</span><span class="o">)</span> <span class="o">{</span>
-			<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"*** "</span> <span class="o">+</span> <span class="n">c</span><span class="o">);</span>
-		<span class="o">}</span>
-		<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"\n\n"</span><span class="o">);</span>
-		<span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
-	<span class="o">}</span>
-	<span class="kd">public</span> <span class="n">File</span><span class="o">[]</span> <span class="nf">getUpload</span><span class="o">()</span> <span class="o">{</span>
-		<span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">uploads</span><span class="o">;</span>
-	<span class="o">}</span>
-	<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUpload</span><span class="o">(</span><span class="n">File</span><span class="o">[]</span> <span class="n">upload</span><span class="o">)</span> <span class="o">{</span>
-		<span class="k">this</span><span class="o">.</span><span class="na">uploads</span> <span class="o">=</span> <span class="n">upload</span><span class="o">;</span>
-	<span class="o">}</span>
-	<span class="kd">public</span> <span class="n">String</span><span class="o">[]</span> <span class="nf">getUploadFileName</span><span class="o">()</span> <span class="o">{</span>
-		<span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">uploadFileNames</span><span class="o">;</span>
-	<span class="o">}</span>
-	<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUploadFileName</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">uploadFileName</span><span class="o">)</span> <span class="o">{</span>
-		<span class="k">this</span><span class="o">.</span><span class="na">uploadFileNames</span> <span class="o">=</span> <span class="n">uploadFileName</span><span class="o">;</span>
-	<span class="o">}</span>
-	<span class="kd">public</span> <span class="n">String</span><span class="o">[]</span> <span class="nf">getUploadContentType</span><span class="o">()</span> <span class="o">{</span>
-		<span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">uploadContentTypes</span><span class="o">;</span>
-	<span class="o">}</span>
-	<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUploadContentType</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">uploadContentType</span><span class="o">)</span> <span class="o">{</span>
-		<span class="k">this</span><span class="o">.</span><span class="na">uploadContentTypes</span> <span class="o">=</span> <span class="n">uploadContentType</span><span class="o">;</span>
-	<span class="o">}</span>
+    <span class="kd">private</span> <span class="n">File</span><span class="o">[]</span> <span class="n">uploads</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="n">String</span><span class="o">[]</span> <span class="n">uploadFileNames</span><span class="o">;</span>
+    <span class="kd">private</span> <span class="n">String</span><span class="o">[]</span> <span class="n">uploadContentTypes</span><span class="o">;</span>
+
+    <span class="kd">public</span> <span class="n">String</span> <span class="nf">upload</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"\n\n upload2"</span><span class="o">);</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"files:"</span><span class="o">);</span>
+        <span class="k">for</span> <span class="o">(</span><span class="n">File</span> <span class="n">u</span> <span class="o">:</span> <span class="n">uploads</span><span class="o">)</span> <span class="o">{</span>
+            <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"*** "</span> <span class="o">+</span> <span class="n">u</span> <span class="o">+</span> <span class="s">"\t"</span> <span class="o">+</span> <span class="n">u</span><span class="o">.</span><span class="na">length</span><span class="o">());</span>
+        <span class="o">}</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"filenames:"</span><span class="o">);</span>
+        <span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">n</span> <span class="o">:</span> <span class="n">uploadFileNames</span><span class="o">)</span> <span class="o">{</span>
+            <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"*** "</span> <span class="o">+</span> <span class="n">n</span><span class="o">);</span>
+        <span class="o">}</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"content types:"</span><span class="o">);</span>
+        <span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">c</span> <span class="o">:</span> <span class="n">uploadContentTypes</span><span class="o">)</span> <span class="o">{</span>
+            <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"*** "</span> <span class="o">+</span> <span class="n">c</span><span class="o">);</span>
+        <span class="o">}</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"\n\n"</span><span class="o">);</span>
+        <span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="n">File</span><span class="o">[]</span> <span class="nf">getUpload</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">uploads</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUpload</span><span class="o">(</span><span class="n">File</span><span class="o">[]</span> <span class="n">upload</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">uploads</span> <span class="o">=</span> <span class="n">upload</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="n">String</span><span class="o">[]</span> <span class="nf">getUploadFileName</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">uploadFileNames</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUploadFileName</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">uploadFileName</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">uploadFileNames</span> <span class="o">=</span> <span class="n">uploadFileName</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="n">String</span><span class="o">[]</span> <span class="nf">getUploadContentType</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">uploadContentTypes</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUploadContentType</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">uploadContentType</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">uploadContentTypes</span> <span class="o">=</span> <span class="n">uploadContentType</span><span class="o">;</span>
+    <span class="o">}</span>
 <span class="o">}</span>
 </code></pre></div></div>
 
@@ -385,63 +240,69 @@ details see <code class="highlighter-rouge">struts-fileupload.xml</code> in the
 
 <p><code class="highlighter-rouge">multipleUploadUsingList.jsp</code> Notice all file input types have the same name.</p>
 
-<pre><code class="language-jsp">&lt;s:form action="doMultipleUploadUsingList" method="POST" enctype="multipart/form-data"&gt;
-  &lt;s:file label="File (1)" name="upload" /&gt;
-  &lt;s:file label="File (2)" name="upload" /&gt;
-  &lt;s:file label="FIle (3)" name="upload" /&gt;
-  &lt;s:submit cssClass="btn btn-primary"/&gt;
-&lt;/s:form&gt;
-</code></pre>
+<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;s:form</span> <span class="na">action=</span><span class="s">"doMultipleUploadUsingList"</span> <span class="na">method=</span><span class="s">"POST"</span> <span class="na">enctype=</span><span class="s">"multipart/form-data"</span><span class="nt">&gt;</span>
+  <span class="nt">&lt;s:file</span> <span class="na">label=</span><span class="s">"File (1)"</span> <span class="na">name=</span><span class="s">"upload"</span> <span class="nt">/&gt;</span>
+  <span class="nt">&lt;s:file</span> <span class="na">label=</span><span class="s">"File (2)"</span> <span class="na">name=</span><span class="s">"upload"</span> <span class="nt">/&gt;</span>
+  <span class="nt">&lt;s:file</span> <span class="na">label=</span><span class="s">"FIle (3)"</span> <span class="na">name=</span><span class="s">"upload"</span> <span class="nt">/&gt;</span>
+  <span class="nt">&lt;s:submit</span> <span class="na">cssClass=</span><span class="s">"btn btn-primary"</span><span class="nt">/&gt;</span>
+<span class="nt">&lt;/s:form&gt;</span>
+</code></pre></div></div>
 
 <p><code class="highlighter-rouge">MultipleFileUploadUsingListAction.java</code></p>
 
 <div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MultipleFileUploadUsingListAction</span> <span class="kd">extends</span> <span class="n">ActionSupport</span> <span class="o">{</span>
-	<span class="kd">private</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">File</span><span class="o">&gt;</span> <span class="n">uploads</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">File</span><span class="o">&gt;();</span>
-	<span class="kd">private</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">uploadFileNames</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span>
-	<span class="kd">private</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">uploadContentTypes</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span>
-
-	<span class="kd">public</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">File</span><span class="o">&gt;</span> <span class="nf">getUpload</span><span class="o">()</span> <span class="o">{</span>
-		<span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">uploads</span><span class="o">;</span>
-	<span class="o">}</span>
-	<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUpload</span><span class="o">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">File</span><span class="o">&gt;</span> <span class="n">uploads</span><span class="o">)</span> <span class="o">{</span>
-		<span class="k">this</span><span class="o">.</span><span class="na">uploads</span> <span class="o">=</span> <span class="n">uploads</span><span class="o">;</span>
-	<span class="o">}</span>
-	<span class="kd">public</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="nf">getUploadFileName</span><span class="o">()</span> <span class="o">{</span>
-		<span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">uploadFileNames</span><span class="o">;</span>
-	<span class="o">}</span>
-	<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUploadFileName</span><span class="o">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">uploadFileNames</span><span class="o">)</span> <span class="o">{</span>
-		<span class="k">this</span><span class="o">.</span><span class="na">uploadFileNames</span> <span class="o">=</span> <span class="n">uploadFileNames</span><span class="o">;</span>
-	<span class="o">}</span>
-	<span class="kd">public</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="nf">getUploadContentType</span><span class="o">()</span> <span class="o">{</span>
-		<span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">uploadContentTypes</span><span class="o">;</span>
-	<span class="o">}</span>
-	<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUploadContentType</span><span class="o">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">contentTypes</span><span class="o">)</span> <span class="o">{</span>
-		<span class="k">this</span><span class="o">.</span><span class="na">uploadContentTypes</span> <span class="o">=</span> <span class="n">contentTypes</span><span class="o">;</span>
-	<span class="o">}</span>
-	<span class="kd">public</span> <span class="n">String</span> <span class="nf">upload</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
-		<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"\n\n upload1"</span><span class="o">);</span>
-		<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"files:"</span><span class="o">);</span>
-		<span class="k">for</span> <span class="o">(</span><span class="n">File</span> <span class="n">u</span> <span class="o">:</span> <span class="n">uploads</span><span class="o">)</span> <span class="o">{</span>
-			<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"*** "</span> <span class="o">+</span> <span class="n">u</span> <span class="o">+</span> <span class="s">"\t"</span> <span class="o">+</span> <span class="n">u</span><span class="o">.</span><span class="na">length</span><span class="o">());</span>
-		<span class="o">}</span>
-		<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"filenames:"</span><span class="o">);</span>
-		<span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">n</span> <span class="o">:</span> <span class="n">uploadFileNames</span><span class="o">)</span> <span class="o">{</span>
-			<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"*** "</span> <span class="o">+</span> <span class="n">n</span><span class="o">);</span>
-		<span class="o">}</span>
-		<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"content types:"</span><span class="o">);</span>
-		<span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">c</span> <span class="o">:</span> <span class="n">uploadContentTypes</span><span class="o">)</span> <span class="o">{</span>
-			<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"*** "</span> <span class="o">+</span> <span class="n">c</span><span class="o">);</span>
-		<span class="o">}</span>
-		<span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"\n\n"</span><span class="o">);</span>
-		<span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
-	<span class="o">}</span>
+    <span class="kd">private</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">File</span><span class="o">&gt;</span> <span class="n">uploads</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">File</span><span class="o">&gt;();</span>
+    <span class="kd">private</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">uploadFileNames</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span>
+    <span class="kd">private</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">uploadContentTypes</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span>
+
+    <span class="kd">public</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">File</span><span class="o">&gt;</span> <span class="nf">getUpload</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">uploads</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUpload</span><span class="o">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">File</span><span class="o">&gt;</span> <span class="n">uploads</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">uploads</span> <span class="o">=</span> <span class="n">uploads</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="nf">getUploadFileName</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">uploadFileNames</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUploadFileName</span><span class="o">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">uploadFileNames</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">uploadFileNames</span> <span class="o">=</span> <span class="n">uploadFileNames</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="nf">getUploadContentType</span><span class="o">()</span> <span class="o">{</span>
+        <span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">uploadContentTypes</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setUploadContentType</span><span class="o">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">contentTypes</span><span class="o">)</span> <span class="o">{</span>
+        <span class="k">this</span><span class="o">.</span><span class="na">uploadContentTypes</span> <span class="o">=</span> <span class="n">contentTypes</span><span class="o">;</span>
+    <span class="o">}</span>
+
+    <span class="kd">public</span> <span class="n">String</span> <span class="nf">upload</span><span class="o">()</span> <span class="kd">throws</span> <span class="n">Exception</span> <span class="o">{</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"\n\n upload1"</span><span class="o">);</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"files:"</span><span class="o">);</span>
+        <span class="k">for</span> <span class="o">(</span><span class="n">File</span> <span class="n">u</span> <span class="o">:</span> <span class="n">uploads</span><span class="o">)</span> <span class="o">{</span>
+            <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"*** "</span> <span class="o">+</span> <span class="n">u</span> <span class="o">+</span> <span class="s">"\t"</span> <span class="o">+</span> <span class="n">u</span><span class="o">.</span><span class="na">length</span><span class="o">());</span>
+        <span class="o">}</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"filenames:"</span><span class="o">);</span>
+        <span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">n</span> <span class="o">:</span> <span class="n">uploadFileNames</span><span class="o">)</span> <span class="o">{</span>
+            <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"*** "</span> <span class="o">+</span> <span class="n">n</span><span class="o">);</span>
+        <span class="o">}</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"content types:"</span><span class="o">);</span>
+        <span class="k">for</span> <span class="o">(</span><span class="n">String</span> <span class="n">c</span> <span class="o">:</span> <span class="n">uploadContentTypes</span><span class="o">)</span> <span class="o">{</span>
+            <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"*** "</span> <span class="o">+</span> <span class="n">c</span><span class="o">);</span>
+        <span class="o">}</span>
+        <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"\n\n"</span><span class="o">);</span>
+        <span class="k">return</span> <span class="n">SUCCESS</span><span class="o">;</span>
+    <span class="o">}</span>
 <span class="o">}</span>
 </code></pre></div></div>
 
 <h2 id="advanced-configuration">Advanced Configuration</h2>
 
-<p>The Struts 2 <code class="highlighter-rouge">default.properties</code> file defines several settings that affect the behavior of file uploading. You may find in necessary 
-to change these values. The names and default values are:</p>
+<p>The Struts 2 <code class="highlighter-rouge">default.properties</code> file defines several settings that affect the behavior of file uploading. You may find
+in necessary to change these values. The names and default values are:</p>
 
 <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>struts.multipart.parser=jakarta
 struts.multipart.saveDir=
@@ -449,29 +310,30 @@ struts.multipart.maxSize=2097152
 </code></pre></div></div>
 
 <blockquote>
-  <p>Please remember that the <code class="highlighter-rouge">struts.multipart.maxSize</code> is the size limit of the whole request, which means when you uploading multiple files, 
+  <p>Please remember that the <code class="highlighter-rouge">struts.multipart.maxSize</code> is the size limit of the whole request, which means when you uploading multiple files,
 the sum of their size must be below the <code class="highlighter-rouge">struts.multipart.maxSize</code>!</p>
 </blockquote>
 
 <p>In order to change theses settings you define a constant in your applications <code class="highlighter-rouge">struts.xml</code> file like so:</p>
 
 <div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
-<span class="cp">&lt;!DOCTYPE struts PUBLIC 
-	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
-	"http://struts.apache.org/dtds/struts-2.0.dtd"&gt;</span>
+<span class="cp">&lt;!DOCTYPE struts PUBLIC
+        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
+        "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;</span>
 <span class="nt">&lt;struts&gt;</span>
-    <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.multipart.maxSize"</span> <span class="na">value=</span><span class="s">"1000000"</span> <span class="nt">/&gt;</span>
+    <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.multipart.maxSize"</span> <span class="na">value=</span><span class="s">"1000000"</span><span class="nt">/&gt;</span>
     ...
 <span class="nt">&lt;/struts&gt;</span>
 </code></pre></div></div>
 
-<p>Additionally the <code class="highlighter-rouge">fileUpload</code> interceptor has settings that can be put in place for individual action mappings by customizing your interceptor stack.</p>
+<p>Additionally the <code class="highlighter-rouge">fileUpload</code> interceptor has settings that can be put in place for individual action mappings by
+customizing your interceptor stack.</p>
 
 <div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"doUpload"</span> <span class="na">class=</span><span class="s">"com.example.UploadAction"</span><span class="nt">&gt;</span>
     <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"basicStack"</span><span class="nt">/&gt;</span>
     <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"fileUpload"</span><span class="nt">&gt;</span>
         <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"allowedTypes"</span><span class="nt">&gt;</span>text/plain<span class="nt">&lt;/param&gt;</span>
-    <span class="nt">&lt;/interceptor-ref&gt;</span> 
+    <span class="nt">&lt;/interceptor-ref&gt;</span>
     <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"validation"</span><span class="nt">/&gt;</span>
     <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"workflow"</span><span class="nt">/&gt;</span>
 
@@ -481,25 +343,26 @@ the sum of their size must be below the <code class="highlighter-rouge">struts.m
 
 <h3 id="file-size-limits">File Size Limits</h3>
 
-<p>There are two separate file size limits. First is <code class="highlighter-rouge">struts.multipart.maxSize</code> which comes from the Struts 2 <code class="highlighter-rouge">default.properties</code> file. 
-This setting exists for security reasons to prohibit a malicious user from uploading extremely large files to file up your servers disk space. 
-This setting defaults to approximately 2 megabytes and should be adjusted to the maximum size file (2 gigs max) that your will need the framework 
-to receive. If you are uploading more than one file on a form the <code class="highlighter-rouge">struts.multipart.maxSize</code> applies to the combined total, not the individual 
-file sizes. The other setting, <code class="highlighter-rouge">maximumSize</code>, is an interceptor setting that is used to ensure a particular Action does not receive a file 
-that is too large. Notice the locations of both settings in the following example:</p>
+<p>There are two separate file size limits. First is <code class="highlighter-rouge">struts.multipart.maxSize</code> which comes from the Struts
+2 <code class="highlighter-rouge">default.properties</code> file. This setting exists for security reasons to prohibit a malicious user from uploading
+extremely large files to file up your servers disk space. This setting defaults to approximately 2 megabytes and should
+be adjusted to the maximum size file (2 gigs max) that your will need the framework to receive. If you are uploading
+more than one file on a form the <code class="highlighter-rouge">struts.multipart.maxSize</code> applies to the combined total, not the individual file
+sizes. The other setting, <code class="highlighter-rouge">maximumSize</code>, is an interceptor setting that is used to ensure a particular Action does not
+receive a file that is too large. Notice the locations of both settings in the following example:</p>
 
 <div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
-<span class="cp">&lt;!DOCTYPE struts PUBLIC 
-	"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
-	"http://struts.apache.org/dtds/struts-2.0.dtd"&gt;</span>
+<span class="cp">&lt;!DOCTYPE struts PUBLIC
+        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
+        "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;</span>
 <span class="nt">&lt;struts&gt;</span>
-    <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.multipart.maxSize"</span> <span class="na">value=</span><span class="s">"1000000"</span> <span class="nt">/&gt;</span>
-    
+    <span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.multipart.maxSize"</span> <span class="na">value=</span><span class="s">"1000000"</span><span class="nt">/&gt;</span>
+
     <span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"doUpload"</span> <span class="na">class=</span><span class="s">"com.example.UploadAction"</span><span class="nt">&gt;</span>
         <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"basicStack"</span><span class="nt">/&gt;</span>
         <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"fileUpload"</span><span class="nt">&gt;</span>
             <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"maximumSize"</span><span class="nt">&gt;</span>500000<span class="nt">&lt;/param&gt;</span>
-        <span class="nt">&lt;/interceptor-ref&gt;</span> 
+        <span class="nt">&lt;/interceptor-ref&gt;</span>
         <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"validation"</span><span class="nt">/&gt;</span>
         <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"workflow"</span><span class="nt">/&gt;</span>
 
@@ -511,14 +374,15 @@ that is too large. Notice the locations of both settings in the following exampl
 
 <h3 id="file-types">File Types</h3>
 
-<p>There are two ways to limit the uploaded file type, decoratively and programmatically. To decoratively limit the file type a comma separated 
-list of allowedTypes can be specified as a fileUpload interceptor param as shown in the following example:</p>
+<p>There are two ways to limit the uploaded file type, decoratively and programmatically. To decoratively limit the file
+type a comma separated list of allowedTypes can be specified as a fileUpload interceptor param as shown in the following
+example:</p>
 
 <div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;action</span> <span class="na">name=</span><span class="s">"doUpload"</span> <span class="na">class=</span><span class="s">"com.example.UploadAction"</span><span class="nt">&gt;</span>
     <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"basicStack"</span><span class="nt">/&gt;</span>
     <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"fileUpload"</span><span class="nt">&gt;</span>
         <span class="nt">&lt;param</span> <span class="na">name=</span><span class="s">"allowedTypes"</span><span class="nt">&gt;</span>image/jpeg,image/gif<span class="nt">&lt;/param&gt;</span>
-    <span class="nt">&lt;/interceptor-ref&gt;</span> 
+    <span class="nt">&lt;/interceptor-ref&gt;</span>
     <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"validation"</span><span class="nt">/&gt;</span>
     <span class="nt">&lt;interceptor-ref</span> <span class="na">name=</span><span class="s">"workflow"</span><span class="nt">/&gt;</span>
 
@@ -526,16 +390,18 @@ list of allowedTypes can be specified as a fileUpload interceptor param as shown
 <span class="nt">&lt;/action&gt;</span>
 </code></pre></div></div>
 
-<p>When the uploaded file type does not match one of the MIME types specified a field error will be created as described in the next section 
-entitled Error Messages. Programmatically limiting the file type means using the information passed in to your Action class via 
-the <code class="highlighter-rouge">setXContentType(String contentType)</code> method. The benefit to this type of approach would be that it’s more flexible and no interceptor 
-configuration would be needed if file sizes are keep under 2 megs.</p>
+<p>When the uploaded file type does not match one of the MIME types specified a field error will be created as described in
+the next section entitled Error Messages. Programmatically limiting the file type means using the information passed in
+to your Action class via the <code class="highlighter-rouge">setXContentType(String contentType)</code> method. The benefit to this type of approach would be
+that it’s more flexible and no interceptor configuration would be needed if file sizes are keep under 2 megs.</p>
 
 <h3 id="error-messages">Error Messages</h3>
 
-<p>If an error occurs several field errors will be added assuming that the action implements <code class="highlighter-rouge">com.opensymphony.xwork2.ValidationAware</code> 
-or extends <code class="highlighter-rouge">com.opensymphony.xwork2.ActionSupport</code>. These error messages are based on several i18n values stored in struts-messages.properties, 
-a default i18n file processed for all i18n requests. You can override the text of these messages by providing text for the following keys:</p>
+<p>If an error occurs several field errors will be added assuming that the action
+implements <code class="highlighter-rouge">com.opensymphony.xwork2.ValidationAware</code>
+or extends <code class="highlighter-rouge">com.opensymphony.xwork2.ActionSupport</code>. These error messages are based on several i18n values stored in
+struts-messages.properties, a default i18n file processed for all i18n requests. You can override the text of these
+messages by providing text for the following keys:</p>
 
 <table>
   <thead>
@@ -574,22 +440,25 @@ a default i18n file processed for all i18n requests. You can override the text o
 
 <h3 id="temporary-directories">Temporary Directories</h3>
 
-<p>All uploaded files are saved to a temporary directory by the framework before being passed in to an Action. Depending on the allowed file 
-sizes it may be necessary to have the framework store these temporary files in an alternate location. To do this change <code class="highlighter-rouge">struts.multipart.saveDir</code> 
-to the directory where the uploaded files will be placed. If this property is not set it defaults to <code class="highlighter-rouge">javax.servlet.context.tempdir</code>. 
-Keep in mind that on some operating systems, like Solaris, <code class="highlighter-rouge">/tmp</code> is memory based and files stored in that directory would consume 
-an amount of RAM approximately equal to the size of the uploaded file.</p>
+<p>All uploaded files are saved to a temporary directory by the framework before being passed in to an Action. Depending on
+the allowed file sizes it may be necessary to have the framework store these temporary files in an alternate location.
+To do this change <code class="highlighter-rouge">struts.multipart.saveDir</code>
+to the directory where the uploaded files will be placed. If this property is not set it defaults
+to <code class="highlighter-rouge">javax.servlet.context.tempdir</code>. Keep in mind that on some operating systems, like Solaris, <code class="highlighter-rouge">/tmp</code> is memory based
+and files stored in that directory would consume an amount of RAM approximately equal to the size of the uploaded file.</p>
 
 <h3 id="alternate-libraries">Alternate Libraries</h3>
 
-<p>The <code class="highlighter-rouge">struts.multipart.parser</code> used by the fileUpload interceptor to handle HTTP POST requests, encoded using the MIME-type <code class="highlighter-rouge">multipart/form-data</code>, 
-can be changed out. Currently there are two choices, jakarta and pell. The jakarta parser is a standard part of the Struts 2 framework needing 
-only its required libraries added to a project. The pell parser uses Jason Pell’s multipart parser instead of the Commons-FileUpload library. 
-The pell parser is a Struts 2 plugin, for more details see: <a href="../plugins/pell/">Pell multipart plugin</a>. There was a third alternative, cos, but it was removed 
-due to licensing incompatibilities.</p>
+<p>The <code class="highlighter-rouge">struts.multipart.parser</code> used by the fileUpload interceptor to handle HTTP POST requests, encoded using the
+MIME-type <code class="highlighter-rouge">multipart/form-data</code>, can be changed out. Currently there are two choices, jakarta and pell. The jakarta
+parser is a standard part of the Struts 2 framework needing only its required libraries added to a project. The pell
+parser uses Jason Pell’s multipart parser instead of the Commons-FileUpload library. The pell parser is a Struts 2
+plugin, for more details see: <a href="../plugins/pell/">Pell multipart plugin</a>. There was a third alternative, cos, but it was
+removed due to licensing incompatibilities.</p>
 
-<p>As from Struts version 2.3.18 a new implementation of <code class="highlighter-rouge">MultiPartRequest</code> was added - <code class="highlighter-rouge">JakartaStreamMultiPartRequest</code>. It can be used to handle 
-large files, see <a href="https://issues.apache.org/jira/browse/WW-3025">WW-3025</a> for more details, but you can simple set</p>
+<p>As from Struts version 2.3.18 a new implementation of <code class="highlighter-rouge">MultiPartRequest</code> was added - <code class="highlighter-rouge">JakartaStreamMultiPartRequest</code>. It
+can be used to handle large files, see <a href="https://issues.apache.org/jira/browse/WW-3025">WW-3025</a> for more details, but
+you can simple set</p>
 
 <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;constant name="struts.multipart.parser" value="jakarta-stream" /&gt;
 </code></pre></div></div>
@@ -598,63 +467,23 @@ large files, see <a href="https://issues.apache.org/jira/browse/WW-3025">WW-302
 
 <h3 id="request-validation">Request validation</h3>
 
-<p>The <code class="highlighter-rouge">struts.multipart.validationRegex</code> is used to define a RegEx to be used to validate if the incoming request is a multipart request. 
-The request must use the <code class="highlighter-rouge">POST</code> method and match the RegEx, by default the RegEx is defined as follow:</p>
+<p>The <code class="highlighter-rouge">struts.multipart.validationRegex</code> is used to define a RegEx to be used to validate if the incoming request is a
+multipart request. The request must use the <code class="highlighter-rouge">POST</code> method and match the RegEx, by default the RegEx is defined as
+follow:</p>
 
-<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>^multipart\\/form-data(; boundary=[a-zA-Z0-9]{1,70})?
+<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>^multipart/form-data(?:\\s*;\\s*boundary=[0-9a-zA-Z'()+_,\\-./:=?]{1,70})?(?:\\s*;\\s*charset=[a-zA-Z\\-0-9]{3,14})?
 </code></pre></div></div>
 
-<p>Please read <a href="https://www.w3.org/Protocols/rfc1341/7\_2\_Multipart">RFC1341</a> the <strong>Multipart section</strong> for more details, existing 
-Struts <code class="highlighter-rouge">Multipart</code> parsers support only <code class="highlighter-rouge">multipart/form-data</code> content type. This option is available since Struts 2.3.11.</p>
+<p>Please read <a href="https://www.w3.org/Protocols/rfc1341/7\_2\_Multipart">RFC1341</a> the <strong>Multipart section</strong> for more details,
+existing Struts <code class="highlighter-rouge">Multipart</code> parsers support only <code class="highlighter-rouge">multipart/form-data</code> content type. This option is available since
+Struts 2.3.11.</p>
 
 <h3 id="disabling-file-upload-support">Disabling file upload support</h3>
 
-<p>You can alternatively disable the whole file upload mechanism defining a constant in <code class="highlighter-rouge">struts.xml</code>:</p>
+<p>You can alternatively disable the whole file upload mechanism defining a constant in <code class="highlighter-rouge">struts.xml</code>:</p>
 
 <div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;constant</span> <span class="na">name=</span><span class="s">"struts.multipart.enabled"</span> <span class="na">value=</span><span class="s">"false"</span><span class="nt">/&gt;</span>
 </code></pre></div></div>
 
-<p>With this constant in place, Struts will ignore a <code class="highlighter-rouge">Content-Type</code> header and will treat each request as an ordinary http request. 
-This option is available since Struts 2.3.11. </p>
-
-  </section>
-</article>
-
-
-<footer class="container">
-  <div class="col-md-12">
-    Copyright &copy; 2000-2021 <a href="http://www.apache.org/">The Apache Software Foundation </a>.
-    All Rights Reserved.
-  </div>
-  <div class="col-md-12">
-    Apache Struts, Struts, Apache, the Apache feather logo, and the Apache Struts project logos are
-    trademarks of The Apache Software Foundation.
-  </div>
-  <div class="col-md-12">Logo and website design donated by <a href="https://softwaremill.com/">SoftwareMill</a>.</div>
-</footer>
-
-<script>!function (d, s, id) {
-  var js, fjs = d.getElementsByTagName(s)[0];
-  if (!d.getElementById(id)) {
-    js = d.createElement(s);
-    js.id = id;
-    js.src = "//platform.twitter.com/widgets.js";
-    fjs.parentNode.insertBefore(js, fjs);
-  }
-}(document, "script", "twitter-wjs");</script>
-<script src="https://apis.google.com/js/platform.js" async="async" defer="defer"></script>
-
-<div id="fb-root"></div>
-
-<script>(function (d, s, id) {
-  var js, fjs = d.getElementsByTagName(s)[0];
-  if (d.getElementById(id)) return;
-  js = d.createElement(s);
-  js.id = id;
-  js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
-  fjs.parentNode.insertBefore(js, fjs);
-}(document, 'script', 'facebook-jssdk'));</script>
-
-
-</body>
-</html>
+<p>With this constant in place, Struts will ignore a <code class="highlighter-rouge">Content-Type</code> header and will treat each request as an ordinary http
+request. This option is available since Struts 2.3.11.</p>