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

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


The following commit(s) were added to refs/heads/main by this push:
     new 897280dfb8 WW-3526 docs: describe how to track file upload progress 
(#359)
897280dfb8 is described below

commit 897280dfb8772c4a02886040b799fc763d43d62d
Author: Lukasz Lenart <[email protected]>
AuthorDate: Fri Oct 16 10:02:44 2026 +0200

    WW-3526 docs: describe how to track file upload progress (#359)
    
    Co-authored-by: Claude Opus 5.5 <[email protected]>
---
 source/core-developers/action-file-upload.md | 51 ++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/source/core-developers/action-file-upload.md 
b/source/core-developers/action-file-upload.md
index f19f958aa5..b2a704d94b 100644
--- a/source/core-developers/action-file-upload.md
+++ b/source/core-developers/action-file-upload.md
@@ -377,6 +377,57 @@ you can simple set
 
 in struts.xml to start using it.
 
+### Upload Progress
+
+Struts does not track upload progress itself. To show a progress bar, use the 
browser's `XMLHttpRequest.upload`
+progress events, which report the bytes sent so far without any server-side 
support:
+
+```js
+const xhr = new XMLHttpRequest();
+xhr.upload.onprogress = (e) => {
+    if (e.lengthComputable) {
+        progressBar.value = e.loaded / e.total;
+    }
+};
+xhr.open('POST', form.action);
+xhr.send(new FormData(form));
+```
+
+If you need progress on the server side, extend one of the parsers and 
register a Commons FileUpload
+`ProgressListener`:
+
+```java
+public class ProgressTrackingMultiPartRequest extends JakartaMultiPartRequest {
+
+    private HttpServletRequest request;
+
+    @Override
+    public void parse(HttpServletRequest request, String saveDir) throws 
IOException {
+        this.request = request;
+        super.parse(request, saveDir);
+    }
+
+    @Override
+    protected JakartaServletDiskFileUpload prepareServletFileUpload(Charset 
charset, Path saveDir) {
+        JakartaServletDiskFileUpload upload = 
super.prepareServletFileUpload(charset, saveDir);
+        upload.setProgressListener((bytesRead, contentLength, items) -> {
+            // publish bytesRead / contentLength where your application can 
read it
+        });
+        return upload;
+    }
+}
+```
+
+and register it as the parser in `struts.xml`:
+
+```xml
+<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" 
name="progress"
+      class="com.example.ProgressTrackingMultiPartRequest" scope="prototype"/>
+<constant name="struts.multipart.parser" value="progress"/>
+```
+
+The same approach works with `JakartaStreamMultiPartRequest`.
+
 ### Request validation
 
 The `struts.multipart.validationRegex` is used to define a RegEx to be used to 
validate if the incoming request is a

Reply via email to