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"><INPUT type="file" name="upload"></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"><form action="doUpload" enctype="multipart/form-data" method="post"></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"><INPUT type="file" name="upload"></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"><form action="doUpload" enctype="multipart/form-data" method="post"></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"><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">></span> - <span class="nt"><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">/></span> - <span class="nt"><s:submit/></span> - <span class="nt"></s:form></span> +<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><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">></span> + <span class="nt"><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">/></span> + <span class="nt"><s:submit/></span> +<span class="nt"></s:form></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"><s:form action="doMultipleUploadUsingArray" method="POST" enctype="multipart/form-data"> - <s:file label="File (1)" name="upload" /> - <s:file label="File (2)" name="upload" /> - <s:file label="FIle (3)" name="upload" /> - <s:submit cssClass="btn btn-primary"/> -</s:form> -</code></pre> +<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><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">></span> + <span class="nt"><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">/></span> + <span class="nt"><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">/></span> + <span class="nt"><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">/></span> + <span class="nt"><s:submit</span> <span class="na">cssClass=</span><span class="s">"btn btn-primary"</span><span class="nt">/></span> +<span class="nt"></s:form></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"><s:form action="doMultipleUploadUsingList" method="POST" enctype="multipart/form-data"> - <s:file label="File (1)" name="upload" /> - <s:file label="File (2)" name="upload" /> - <s:file label="FIle (3)" name="upload" /> - <s:submit cssClass="btn btn-primary"/> -</s:form> -</code></pre> +<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><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">></span> + <span class="nt"><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">/></span> + <span class="nt"><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">/></span> + <span class="nt"><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">/></span> + <span class="nt"><s:submit</span> <span class="na">cssClass=</span><span class="s">"btn btn-primary"</span><span class="nt">/></span> +<span class="nt"></s:form></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"><</span><span class="n">File</span><span class="o">></span> <span class="n">uploads</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o"><</span><span class="n">File</span><span class="o">>();</span> - <span class="kd">private</span> <span class="n">List</span><span class="o"><</span><span class="n">String</span><span class="o">></span> <span class="n">uploadFileNames</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o"><</span><span class="n">String</span><span class="o">>();</span> - <span class="kd">private</span> <span class="n">List</span><span class="o"><</span><span class="n">String</span><span class="o">></span> <span class="n">uploadContentTypes</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o"><</span><span class="n">String</span><span class="o">>();</span> - - <span class="kd">public</span> <span class="n">List</span><span class="o"><</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">List</span><span class="o"><</span><span class="n">File</span><span class="o">></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"><</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">List</span><span class="o"><</span><span class="n">String</span><span class="o">></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"><</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">List</span><span class="o"><</span><span class="n">String</span><span class="o">></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"><</span><span class="n">File</span><span class="o">></span> <span class="n">uploads</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o"><</span><span class="n">File</span><span class="o">>();</span> + <span class="kd">private</span> <span class="n">List</span><span class="o"><</span><span class="n">String</span><span class="o">></span> <span class="n">uploadFileNames</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o"><</span><span class="n">String</span><span class="o">>();</span> + <span class="kd">private</span> <span class="n">List</span><span class="o"><</span><span class="n">String</span><span class="o">></span> <span class="n">uploadContentTypes</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o"><</span><span class="n">String</span><span class="o">>();</span> + + <span class="kd">public</span> <span class="n">List</span><span class="o"><</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">List</span><span class="o"><</span><span class="n">File</span><span class="o">></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"><</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">List</span><span class="o"><</span><span class="n">String</span><span class="o">></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"><</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">List</span><span class="o"><</span><span class="n">String</span><span class="o">></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"><?xml version="1.0" encoding="UTF-8"?></span> -<span class="cp"><!DOCTYPE struts PUBLIC - "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" - "http://struts.apache.org/dtds/struts-2.0.dtd"></span> +<span class="cp"><!DOCTYPE struts PUBLIC + "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" + "http://struts.apache.org/dtds/struts-2.0.dtd"></span> <span class="nt"><struts></span> - <span class="nt"><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">/></span> + <span class="nt"><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">/></span> ... <span class="nt"></struts></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"><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">></span> <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"basicStack"</span><span class="nt">/></span> <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"fileUpload"</span><span class="nt">></span> <span class="nt"><param</span> <span class="na">name=</span><span class="s">"allowedTypes"</span><span class="nt">></span>text/plain<span class="nt"></param></span> - <span class="nt"></interceptor-ref></span> + <span class="nt"></interceptor-ref></span> <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"validation"</span><span class="nt">/></span> <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"workflow"</span><span class="nt">/></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"><?xml version="1.0" encoding="UTF-8"?></span> -<span class="cp"><!DOCTYPE struts PUBLIC - "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" - "http://struts.apache.org/dtds/struts-2.0.dtd"></span> +<span class="cp"><!DOCTYPE struts PUBLIC + "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" + "http://struts.apache.org/dtds/struts-2.0.dtd"></span> <span class="nt"><struts></span> - <span class="nt"><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">/></span> - + <span class="nt"><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">/></span> + <span class="nt"><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">></span> <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"basicStack"</span><span class="nt">/></span> <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"fileUpload"</span><span class="nt">></span> <span class="nt"><param</span> <span class="na">name=</span><span class="s">"maximumSize"</span><span class="nt">></span>500000<span class="nt"></param></span> - <span class="nt"></interceptor-ref></span> + <span class="nt"></interceptor-ref></span> <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"validation"</span><span class="nt">/></span> <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"workflow"</span><span class="nt">/></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"><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">></span> <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"basicStack"</span><span class="nt">/></span> <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"fileUpload"</span><span class="nt">></span> <span class="nt"><param</span> <span class="na">name=</span><span class="s">"allowedTypes"</span><span class="nt">></span>image/jpeg,image/gif<span class="nt"></param></span> - <span class="nt"></interceptor-ref></span> + <span class="nt"></interceptor-ref></span> <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"validation"</span><span class="nt">/></span> <span class="nt"><interceptor-ref</span> <span class="na">name=</span><span class="s">"workflow"</span><span class="nt">/></span> @@ -526,16 +390,18 @@ list of allowedTypes can be specified as a fileUpload interceptor param as shown <span class="nt"></action></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><constant name="struts.multipart.parser" value="jakarta-stream" /> </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"><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">/></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 © 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>