diff --git a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java index 279c1e928e..bdcc2e5bb3 100644 --- a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java +++ b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java @@ -37,6 +37,7 @@ public class FileUploadAction extends ActionSupport implements UploadedFilesAwar private String fileName; private String caption; private String originalName; + private String inputName; public String input() throws Exception { return SUCCESS; @@ -58,6 +59,10 @@ public String getOriginalName() { return originalName; } + public String getInputName() { + return inputName; + } + public Object getUploadedFile() { return uploadedFile.getContent(); } @@ -85,5 +90,6 @@ public void withUploadedFiles(List uploadedFiles) { this.fileName = uploadedFile.getName(); this.contentType = uploadedFile.getContentType(); this.originalName = uploadedFile.getOriginalName(); + this.inputName = uploadedFile.getInputName(); } } diff --git a/apps/showcase/src/main/webapp/WEB-INF/fileupload/upload-success.jsp b/apps/showcase/src/main/webapp/WEB-INF/fileupload/upload-success.jsp index a1b06277af..4d42c7e457 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/fileupload/upload-success.jsp +++ b/apps/showcase/src/main/webapp/WEB-INF/fileupload/upload-success.jsp @@ -41,7 +41,8 @@
  • FileName:
  • Original FileName:
  • File:
  • -
  • Caption:
  • +
  • Caption:
  • +
  • Input name:
  • diff --git a/apps/showcase/src/test/java/it/org/apache/struts2/showcase/FileUploadTest.java b/apps/showcase/src/test/java/it/org/apache/struts2/showcase/FileUploadTest.java index 498d4d4ad5..e4f5f882d2 100644 --- a/apps/showcase/src/test/java/it/org/apache/struts2/showcase/FileUploadTest.java +++ b/apps/showcase/src/test/java/it/org/apache/struts2/showcase/FileUploadTest.java @@ -25,10 +25,14 @@ import com.gargoylesoftware.htmlunit.html.HtmlInput; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput; -import org.junit.Assert; import org.junit.Test; import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; public class FileUploadTest { @@ -45,9 +49,31 @@ public void testEmptyFile() throws Exception { uploadInput.setValueAttribute(tempFile.getAbsolutePath()); final HtmlSubmitInput button = form.getInputByValue("Submit"); final HtmlPage resultPage = button.click(); + DomElement errorMessage = resultPage.getFirstByXPath("//span[@class='errorMessage']"); - Assert.assertNotNull(errorMessage); - Assert.assertEquals("File cannot be empty", errorMessage.getVisibleText()); + assertNotNull(errorMessage); + assertEquals("File cannot be empty", errorMessage.getVisibleText()); + } + } + + @Test + public void testFileUpload() throws Exception { + try (final WebClient webClient = new WebClient()) { + final HtmlPage page = webClient.getPage(ParameterUtils.getBaseUrl() + "/fileupload/doUpload.action"); + final HtmlForm form = page.getFormByName("doUpload"); + HtmlInput captionInput = form.getInputByName("caption"); + HtmlFileInput uploadInput = form.getInputByName("upload"); + captionInput.type("some caption"); + File tempFile = File.createTempFile("testEmptyFile", ".tmp"); + Files.write(Paths.get(tempFile.toURI()), "some content".getBytes()); + tempFile.deleteOnExit(); + uploadInput.setValueAttribute(tempFile.getAbsolutePath()); + final HtmlSubmitInput button = form.getInputByValue("Submit"); + final HtmlPage resultPage = button.click(); + + DomElement inputName = resultPage.getElementById("input-name"); + assertNotNull(inputName); + assertEquals("Input name: upload", inputName.getTextContent().trim()); } } diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java index 1c0f458a01..491d3d41de 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java @@ -246,6 +246,7 @@ public UploadedFile[] getFile(String fieldName) { UploadedFile uploadedFile = StrutsUploadedFile.Builder.create(storeLocation) .withContentType(fileItem.getContentType()) .withOriginalName(fileItem.getName()) + .withInputName(fileItem.getFieldName()) .build(); fileList.add(uploadedFile); } diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java index 428ae112fc..3985e0f522 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java @@ -113,6 +113,7 @@ public UploadedFile[] getFile(String fieldName) { StrutsUploadedFile.Builder.create(fileInfo.getFile()) .withContentType(fileInfo.contentType) .withOriginalName(fileInfo.originalName) + .withInputName(fileInfo.getInputName()) .build() ).toArray(UploadedFile[]::new); } @@ -423,7 +424,7 @@ protected void createFileInfoFromItemStream(FileItemStream itemStream, File file String fileName = itemStream.getName(); String fieldName = itemStream.getFieldName(); // create internal structure - FileInfo fileInfo = new FileInfo(file, itemStream.getContentType(), fileName); + FileInfo fileInfo = new FileInfo(file, itemStream.getContentType(), fileName, itemStream.getFieldName()); // append or create new entry. if (!fileInfos.containsKey(fieldName)) { List infos = new ArrayList<>(); @@ -447,6 +448,7 @@ public static class FileInfo implements Serializable { private final File file; private final String contentType; private final String originalName; + private final String inputName; /** * Default constructor. @@ -455,10 +457,11 @@ public static class FileInfo implements Serializable { * @param contentType content type * @param originalName original file name */ - public FileInfo(File file, String contentType, String originalName) { + public FileInfo(File file, String contentType, String originalName, String inputName) { this.file = file; this.contentType = contentType; this.originalName = originalName; + this.inputName = inputName; } /** @@ -481,6 +484,14 @@ public String getContentType() { public String getOriginalName() { return originalName; } + + /** + * @return file input name + * @since 6.7.0 + */ + public String getInputName() { + return inputName; + } } } diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/StrutsUploadedFile.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/StrutsUploadedFile.java index 5976f578f7..eb9feccc56 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/StrutsUploadedFile.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/StrutsUploadedFile.java @@ -25,6 +25,7 @@ public class StrutsUploadedFile implements UploadedFile { private final File file; private final String contentType; private final String originalName; + private final String inputName; /** * Use builder instead of constructor @@ -36,12 +37,14 @@ public StrutsUploadedFile(File file) { this.file = file; this.contentType = null; this.originalName = null; + this.inputName = null; } - private StrutsUploadedFile(File file, String contentType, String originalName) { + private StrutsUploadedFile(File file, String contentType, String originalName, String inputName) { this.file = file; this.contentType = contentType; this.originalName = originalName; + this.inputName = inputName; } @Override @@ -84,11 +87,17 @@ public String getOriginalName() { return originalName; } + @Override + public String getInputName() { + return inputName; + } + @Override public String toString() { return "StrutsUploadedFile{" + "contentType='" + contentType + '\'' + ", originalName='" + originalName + '\'' + + ", inputName='" + inputName + '\'' + '}'; } @@ -96,6 +105,7 @@ public static class Builder { private final File file; private String contentType; private String originalName; + private String inputName; private Builder(File file) { this.file = file; @@ -115,8 +125,13 @@ public Builder withOriginalName(String originalName) { return this; } + public Builder withInputName(String inputName) { + this.inputName = inputName; + return this; + } + public UploadedFile build() { - return new StrutsUploadedFile(this.file, this.contentType, this.originalName); + return new StrutsUploadedFile(this.file, this.contentType, this.originalName, this.inputName); } } } diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/UploadedFile.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/UploadedFile.java index ada27ff6c4..728a98e433 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/UploadedFile.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/UploadedFile.java @@ -41,4 +41,13 @@ public interface UploadedFile extends Serializable { String getContentType(); + /** + * Represents a name of the input file, eg.: + * "myFile" in case of + * + * @return name of the input file field + * @since 6.7.0 + */ + String getInputName(); + } diff --git a/core/src/test/java/org/apache/struts2/interceptor/ActionFileUploadInterceptorTest.java b/core/src/test/java/org/apache/struts2/interceptor/ActionFileUploadInterceptorTest.java index 51747b1473..1fbb5017b4 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/ActionFileUploadInterceptorTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/ActionFileUploadInterceptorTest.java @@ -91,6 +91,11 @@ public String getOriginalName() { public String getContentType() { return null; } + + @Override + public String getInputName() { + return null; + } }; private ActionFileUploadInterceptor interceptor; diff --git a/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java b/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java index cfb3057701..040a2f61a1 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java @@ -93,6 +93,11 @@ public String getOriginalName() { public String getContentType() { return null; } + + @Override + public String getInputName() { + return null; + } }; private FileUploadInterceptor interceptor; diff --git a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java index d2db975d42..ef5019d4b6 100644 --- a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java +++ b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java @@ -71,6 +71,7 @@ public UploadedFile[] getFile(String fieldName) { return new UploadedFile[]{StrutsUploadedFile.Builder.create(multi.getFile(fieldName)) .withContentType(multi.getContentType(fieldName)) .withOriginalName(multi.getFileSystemName(fieldName)) + .withInputName(fieldName) .build() }; }