A bit more testing reveals a few clues/issues:
If I switch the parser to "jakarta" (instead of "jakarta-stream") everything works as expected. The jakarta-stream parser is obviously not converting the stream for each action field variable to a String properly When debugging the ParametersInterceptor (and using jakarta-stream), all the fields names exist in the parameters map, and their values are of type String, but the String value is: "org.apache.commons.fileupload2.core.MultipartInput$ItemInputStream@47453950"

When using the jakarta parser, I am finding that the "struts.multipart.maxFiles" setting is compared against the number of form fields in the request, not the number of files in the request. For example, if I have a form with 10 text fields and 1 file field and maxFiles=10, I will get a "Request exceeded allowed number of files" error. FYI: The maxFiles check is only made if a file exists in the request. If no file exists, then the multi-part form is successfully submitted regardless of the number of form fields

I am noticing an inconsistency in the way each parser stores the uploaded files in the temp dir. The jakarta parser stores the files with a "[uuid].tmp" extension and the "jakarta-stream" stores the uploaded file with the original file extension (e.g. [uuid].pdf). I feel like they should be the same especially if you want to swap out parsers at a later time. FWIW, the *.tmp extension breaks functionality in my application (although it's fairly trivial to fix on my end) so my vote would be to keep the original file extension - but perhaps this is a security issue?
Thanks,
Burton

------ Original Message ------
From "Burton Rhodes" <burtonrho...@gmail.com>
To "Struts Developers List" <dev@struts.apache.org>
Date 1/22/2024 9:12:57 PM
Subject [7.0.0-M1] Actions not setting parameters with Multi-part forms

The biggest issue I'm having at the moment is with all of my multi-part forms that 
include parameter data and a file. The action does receive the file, but the parameter 
"team.company" is set to the String value of stream, for example:
"org.apache.commons.fileupload2.core.MultipartInput$ItemInputStream@1afaa502"  
Am I missing something obvious?

To add, it actually doesn't matter if I have a file field in the form.  Any form with 
[enctype="multipart/form-data"] never sets the action fields properly.  Is 
there a different parser I should be referencing?  Or are my interceptors not correct?


Example Form
<s:form name="frmTeamInfo" action="AdminTeam_update"
        method="post" enctype="multipart/form-data" accept-charset="utf-8">
    <s:textfield name="team.company" />
    <s:file id="logoFileUpload" name="upload"/>
    <s:submit value="Save" />
</s:form>

Parser
<constant name="struts.multipart.parser" value="jakarta-stream" />

Interceptor Stack
<interceptor-stack name="myParamsPrepareParamsStack">
    <interceptor-ref name="exception"/>
    <interceptor-ref name="checkbox"/>
    <interceptor-ref name="datetime"/>
    <interceptor-ref name="multiselect"/>
    <interceptor-ref name="params"/>
    <interceptor-ref name="servletConfig"/>
    <interceptor-ref name="httpMethod"/>
    <interceptor-ref name="prepare"/>
    <interceptor-ref name="modelDriven"/>
    <interceptor-ref name="fileUpload"/>
    <interceptor-ref name="actionFileUpload"/>
    <interceptor-ref name="staticParams"/>
    <interceptor-ref name="actionMappingParams"/>
    <interceptor-ref name="params"/>
    <interceptor-ref name="conversionError"/>
    <interceptor-ref name="validation">
        <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <interceptor-ref name="workflow">
        <param name="excludeMethods">input,back,cancel,browse</param>
    </interceptor-ref>
    <interceptor-ref name="debugging"/>
</interceptor-stack>

Reply via email to