You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Lukasz Lenart <lu...@apache.org> on 2024/03/01 06:17:50 UTC

Re: Struts 6.3 Issue Uploading Files

The request must match the following regex [1], more details in the
docs [2], yet I notice there is no logging around this logic, feel
free to create a ticket to improve that.

[1] https://github.com/apache/struts/blob/master/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java#L110
[2] https://struts.apache.org/core-developers/file-upload.html#request-validation

śr., 28 lut 2024 o 23:28 Zoran Avtarovski <zo...@sparecreative.com> napisał(a):
>
> Hi Guys,
>
>
>
> We are unable to upload files to our first 6.3 application using HTTP requests, but the strange thing is they work with ajax requests. I suspect we are overlooking something in the config which is required in 6.3.
>
>
>
> We are using 6.3.0.2 running on Tomcat 9. The file object is null after the upload but we can see the upload is there.
>
>
>
> I can see the params interceptor finds the file and copies it to the temp directory, but I then can’t access the file in the action??? What’s really strange is if we use the same mechanism using a an ajax request with FormData it works as expected. That’s why we created a simple setup as outlined below to identify the root cause.
>
>
>
> Any help would really be appreciated.
>
>
>
> Here’s a snippet of the logs:
>
> multipart.JakartaMultiPartRequest (JakartaMultiPartRequest.java:103) - Found file item: [upload]
>
> multipart.JakartaMultiPartRequest (JakartaMultiPartRequest.java:114) - Item is a file upload
>
>
>
> When I try and access the file in my action:
>
> action.IndexAction (IndexAction.java:54) - Uploaded file : null
>
> action.IndexAction (IndexAction.java:55) - Uploaded file name : null
>
> action.IndexAction (IndexAction.java:56) - Uploaded file type : null
>
> action.IndexAction (IndexAction.java:57) - Uploaded file length  : 0
>
>
>
>
>
> And then after the request has completed:
>
> multipart.JakartaMultiPartRequest (JakartaMultiPartRequest.java:361) - Removing file upload name=Invoice - 1331-1.pdf, StoreLocation= /apache-tomcat-9.0.44_base/work/Catalina/localhost/caams/upload_0569c990_d32c_4688_ad50_44db275ab0cc_00000000.tmp, size=465396 bytes, isFormField=false, FieldName=upload
>
>
>
> This is what my form looks like:
>
>
>
> <s:form enctype="multipart/form-data" action="testUpload" method="post" theme="simple">
>
> <s:file name="upload" key="file.to.upload" />
>
>               <button type="submit" >Submit</button>
>
> </s:form>
>
>
>
> My action has the following (BaseAction extends ActionSupport):
>
>
>
> public class IndexAction extends BaseAction {
>
>
>
>     private File upload;
>
>     private String uploadFileName;
>
>     private String uploadContentType;
>
>     private long uploadContentLength;
>
>
>
>     public IndexAction() {
>
>     }
>
>
>
>     @Override
>
>     public String execute() {
>
>         return SUCCESS;
>
>     }
>
>
>
>     public String edit() {
>
>         return INPUT;
>
>     }
>
>
>
>     public String uploadTest() {
>
>         try {
>
>             LOGGER.debug("Uploaded file : "+ upload);
>
>             LOGGER.debug("Uploaded file name : "+ uploadFileName);
>
>             LOGGER.debug("Uploaded file type : "+ uploadContentType);
>
>             LOGGER.debug("Uploaded file length  : "+ uploadContentLength);
>
>
>
>             inputStream = new FileInputStream(upload);
>
>
>
>             if (inputStream != null) {
>
>                 inputStream.close();
>
>             }
>
>
>
>         } catch (Exception e) {
>
>             LOGGER.error("General . uploading error :", e);
>
>         }
>
>
>
>         return SUCCESS;
>
>     }
>
>
>
>     public File getUpload() {
>
>         return upload;
>
>     }
>
>
>
>     public void setUpload(File upload) {
>
>         this.upload = upload;
>
>     }
>
>
>
>     public String getUploadFileName() {
>
>         return uploadFileName;
>
>     }
>
>
>
>     public void setUploadFileName(String uploadFileName) {
>
>         this.uploadFileName = uploadFileName;
>
>     }
>
>
>
>     public String getUploadContentType() {
>
>         return uploadContentType;
>
>     }
>
>
>
>     public void setUploadContentType(String uploadContentType) {
>
>         this.uploadContentType = uploadContentType;
>
>     }
>
>
>
>     public long getUploadContentLength() {
>
>         return uploadContentLength;
>
>     }
>
>
>
>     public void setUploadContentLength(long uploadContentLength) {
>
>         this.uploadContentLength = uploadContentLength;
>
>     }
>
> }
>
>
>
> My relevant struts.xml config:
>
>
>
>     <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
>
>     <constant name="struts.i18n.encoding" value="UTF-8"/>
>
>     <constant name="struts.devMode" value="false"/>
>
>     <constant name="struts.locale" value="en_AU"/>
>
>     <constant name="struts.ui.theme" value="simple"/>
>
>     <constant name="struts.ui.templateDir" value="template"/>
>
>
>
>     <constant name="struts.i18n.search.defaultbundles.first" value="true"/>
>
>     <constant name="struts.ui.escapeHtmlBody" value="true"/>
>
>
>
>     <!-- Max file size of 15mb -->
>
>     <constant name="struts.multipart.maxSize" value="45000000" />
>
>     <constant name="struts.multipart.maxStringLength" value="45000000" />
>
>
>
>     <package name="spareTest" extends="default">
>
>         <default-interceptor-ref name="paramsPrepareParamsStack"/>
>
>
>
>         <action name="testUpload" class="indexAction" method="uploadTest">
>
>             <result name="input" >/WEB-INF/pages/main/formUpload.jsp</result>
>
>             <result name="success" type="redirectAction">home</result>
>
>         </action>
>
>
>
>         <action name="testFile" class="indexAction" method="edit">
>
>             <result name="input" >/WEB-INF/pages/main/formUpload.jsp</result>
>
>         </action>
>
>
>
>     </package>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


AW: Struts 6.3 Issue Uploading Files

Posted by Patrick Arnoldy <PA...@meetingmasters.de>.
Hello,

we just had a similar issue in our application after migrating to Tomcat 9.
This may not be a Struts problem, but a change in how Tomcat treats files since version 9.

Please have a look at those links:
https://stackoverflow.com/questions/48175852/tomcat9-file-permissions-change
https://tomcat.apache.org/tomcat-9.0-doc/changelog.html   (look for "Tomcat 9.0.0.M1 (markt)")


Regards
Patrick Arnoldy


-----Ursprüngliche Nachricht-----
Von: Lukasz Lenart <lu...@apache.org> 
Gesendet: Mittwoch, 6. März 2024 08:10
An: Struts Users Mailing List <us...@struts.apache.org>
Betreff: Re: Struts 6.3 Issue Uploading Files

Can you take a look at this PR? Can you test it?
https://github.com/apache/struts/pull/892

śr., 6 mar 2024 o 07:51 Lukasz Lenart <lu...@apache.org> napisał(a):
>
> pon., 4 mar 2024 o 00:28 Zoran Avtarovski <zo...@sparecreative.com> napisał(a):
> > I tried to raise a ticket to include some logging in the isMultipartRequest function to record why it failed but I don't have an account anymore.
>
> I've created the ticket
> https://issues.apache.org/jira/browse/WW-5401
>
>
> Cheers
> Lukasz

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org

Re: Struts 6.3 Issue Uploading Files

Posted by Lukasz Lenart <lu...@apache.org>.
Can you take a look at this PR? Can you test it?
https://github.com/apache/struts/pull/892

śr., 6 mar 2024 o 07:51 Lukasz Lenart <lu...@apache.org> napisał(a):
>
> pon., 4 mar 2024 o 00:28 Zoran Avtarovski <zo...@sparecreative.com> napisał(a):
> > I tried to raise a ticket to include some logging in the isMultipartRequest function to record why it failed but I don't have an account anymore.
>
> I've created the ticket
> https://issues.apache.org/jira/browse/WW-5401
>
>
> Cheers
> Lukasz

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Struts 6.3 Issue Uploading Files

Posted by Lukasz Lenart <lu...@apache.org>.
pon., 4 mar 2024 o 00:28 Zoran Avtarovski <zo...@sparecreative.com> napisał(a):
> I tried to raise a ticket to include some logging in the isMultipartRequest function to record why it failed but I don't have an account anymore.

I've created the ticket
https://issues.apache.org/jira/browse/WW-5401


Cheers
Lukasz

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Struts 6.3 Issue Uploading Files

Posted by Zoran Avtarovski <zo...@sparecreative.com>.
Thanks Lukasz,

I'm not sure that is the issue. I did a simple verification test and added some debugging around the request content type I got the following :
Request Content Type: multipart/form-data; boundary=---------------------------22500187869113554433768726201
Using default regex string content type REGEX : true

I just plugged the default value into the REGEX parser :
Pattern multipartValidationPattern = Pattern.compile("^multipart/form-data(?:\\s*;\\s*boundary=[0-9a-zA-Z'()+_,\\-./:=?]{1,70})?(?:\\s*;\\s*charset=[a-zA-Z\\-0-9]{3,14})?");
boolean validContentType = request.getContentType() != null && multipartValidationPattern.matcher(contentType.toLowerCase(Locale.ENGLISH)).matches();

I tried to raise a ticket to include some logging in the isMultipartRequest function to record why it failed but I don't have an account anymore.

I will modify the source code locally to add some debug code this afternoon. Hopefully it will build OK and I can get back to you with some feedback.

Z.


On 1/3/2024, 5:19 pm, "Lukasz Lenart" <lukaszlenart@apache.org <ma...@apache.org>> wrote:


The request must match the following regex [1], more details in the
docs [2], yet I notice there is no logging around this logic, feel
free to create a ticket to improve that.


[1] https://github.com/apache/struts/blob/master/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java#L110 <https://github.com/apache/struts/blob/master/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java#L110>
[2] https://struts.apache.org/core-developers/file-upload.html#request-validation <https://struts.apache.org/core-developers/file-upload.html#request-validation>


śr., 28 lut 2024 o 23:28 Zoran Avtarovski <zoran@sparecreative.com <ma...@sparecreative.com>> napisał(a):
>
> Hi Guys,
>
>
>
> We are unable to upload files to our first 6.3 application using HTTP requests, but the strange thing is they work with ajax requests. I suspect we are overlooking something in the config which is required in 6.3.
>
>
>
> We are using 6.3.0.2 running on Tomcat 9. The file object is null after the upload but we can see the upload is there.
>
>
>
> I can see the params interceptor finds the file and copies it to the temp directory, but I then can’t access the file in the action??? What’s really strange is if we use the same mechanism using a an ajax request with FormData it works as expected. That’s why we created a simple setup as outlined below to identify the root cause.
>
>
>
> Any help would really be appreciated.
>
>
>
> Here’s a snippet of the logs:
>
> multipart.JakartaMultiPartRequest (JakartaMultiPartRequest.java:103) - Found file item: [upload]
>
> multipart.JakartaMultiPartRequest (JakartaMultiPartRequest.java:114) - Item is a file upload
>
>
>
> When I try and access the file in my action:
>
> action.IndexAction (IndexAction.java:54) - Uploaded file : null
>
> action.IndexAction (IndexAction.java:55) - Uploaded file name : null
>
> action.IndexAction (IndexAction.java:56) - Uploaded file type : null
>
> action.IndexAction (IndexAction.java:57) - Uploaded file length : 0
>
>
>
>
>
> And then after the request has completed:
>
> multipart.JakartaMultiPartRequest (JakartaMultiPartRequest.java:361) - Removing file upload name=Invoice - 1331-1.pdf, StoreLocation= /apache-tomcat-9.0.44_base/work/Catalina/localhost/caams/upload_0569c990_d32c_4688_ad50_44db275ab0cc_00000000.tmp, size=465396 bytes, isFormField=false, FieldName=upload
>
>
>
> This is what my form looks like:
>
>
>
> <s:form enctype="multipart/form-data" action="testUpload" method="post" theme="simple">
>
> <s:file name="upload" key="file.to.upload" />
>
> <button type="submit" >Submit</button>
>
> </s:form>
>
>
>
> My action has the following (BaseAction extends ActionSupport):
>
>
>
> public class IndexAction extends BaseAction {
>
>
>
> private File upload;
>
> private String uploadFileName;
>
> private String uploadContentType;
>
> private long uploadContentLength;
>
>
>
> public IndexAction() {
>
> }
>
>
>
> @Override
>
> public String execute() {
>
> return SUCCESS;
>
> }
>
>
>
> public String edit() {
>
> return INPUT;
>
> }
>
>
>
> public String uploadTest() {
>
> try {
>
> LOGGER.debug("Uploaded file : "+ upload);
>
> LOGGER.debug("Uploaded file name : "+ uploadFileName);
>
> LOGGER.debug("Uploaded file type : "+ uploadContentType);
>
> LOGGER.debug("Uploaded file length : "+ uploadContentLength);
>
>
>
> inputStream = new FileInputStream(upload);
>
>
>
> if (inputStream != null) {
>
> inputStream.close();
>
> }
>
>
>
> } catch (Exception e) {
>
> LOGGER.error("General . uploading error :", e);
>
> }
>
>
>
> return SUCCESS;
>
> }
>
>
>
> public File getUpload() {
>
> return upload;
>
> }
>
>
>
> public void setUpload(File upload) {
>
> this.upload = upload;
>
> }
>
>
>
> public String getUploadFileName() {
>
> return uploadFileName;
>
> }
>
>
>
> public void setUploadFileName(String uploadFileName) {
>
> this.uploadFileName = uploadFileName;
>
> }
>
>
>
> public String getUploadContentType() {
>
> return uploadContentType;
>
> }
>
>
>
> public void setUploadContentType(String uploadContentType) {
>
> this.uploadContentType = uploadContentType;
>
> }
>
>
>
> public long getUploadContentLength() {
>
> return uploadContentLength;
>
> }
>
>
>
> public void setUploadContentLength(long uploadContentLength) {
>
> this.uploadContentLength = uploadContentLength;
>
> }
>
> }
>
>
>
> My relevant struts.xml config:
>
>
>
> <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
>
> <constant name="struts.i18n.encoding" value="UTF-8"/>
>
> <constant name="struts.devMode" value="false"/>
>
> <constant name="struts.locale" value="en_AU"/>
>
> <constant name="struts.ui.theme" value="simple"/>
>
> <constant name="struts.ui.templateDir" value="template"/>
>
>
>
> <constant name="struts.i18n.search.defaultbundles.first" value="true"/>
>
> <constant name="struts.ui.escapeHtmlBody" value="true"/>
>
>
>
> <!-- Max file size of 15mb -->
>
> <constant name="struts.multipart.maxSize" value="45000000" />
>
> <constant name="struts.multipart.maxStringLength" value="45000000" />
>
>
>
> <package name="spareTest" extends="default">
>
> <default-interceptor-ref name="paramsPrepareParamsStack"/>
>
>
>
> <action name="testUpload" class="indexAction" method="uploadTest">
>
> <result name="input" >/WEB-INF/pages/main/formUpload.jsp</result>
>
> <result name="success" type="redirectAction">home</result>
>
> </action>
>
>
>
> <action name="testFile" class="indexAction" method="edit">
>
> <result name="input" >/WEB-INF/pages/main/formUpload.jsp</result>
>
> </action>
>
>
>
> </package>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org <ma...@struts.apache.org>
For additional commands, e-mail: user-help@struts.apache.org <ma...@struts.apache.org>







---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org