当前位置: 首页 > 知识库问答 >
问题:

FileUpload,Struts2,FileUploaderInterceptor中没有文件

云骏奇
2023-03-14

有一个工作的Struts2Portlet环境,在portlet模式下,我无法使Struts文件上传工作。

我看得出来

  • 将在临时空间中创建一个文件上载到服务器
  • 原始请求上存在一个多部分请求,其中包含文件名和文件内容,并在其中输入Struts类
  • 我可以触发最大大小响应,这是Struts中设置的默认值
  • FileUploadInterceptor被触发,但在Jakarta MultipartRequest中没有文件。在原始请求和Jakarta包装之间的某个地方,文件丢失

我在一个精简的Spring Boot2应用程序中尝试了同样的方法,出现了与主项目相同的问题。遵循代码在

https://struts.apache.org/core-developers/file-upload.html

用于JSP和action类。创建了portlet,流工作,但动作中没有文件。

标准Sping Boot 2带有额外的pom:

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-spring-plugin</artifactId>
    <version>2.5.20</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

Struts。xml

<package name="uploadtest" extends="struts-portlet-default" namespace="/uploadtest">

    <action name="uploadtestPrepare" class="bouvet.no.fileuploadtest.action.FileUploadSubmitAction">
        <result name="success">/WEB-INF/struts2/test/fileUpload.jsp</result>
    </action>
    <action name="uploadTestSubmit" class="bouvet.no.fileuploadtest.action.FileUploadSubmitAction">
        <result name="success">/WEB-INF/struts2/test/fileUpload.jsp</result>
    </action>
</package>

还有形式

<s:form action="uploadTestSubmit" method="post" enctype="multipart/form-data">
    FileName: <s:property value="%{filename}"/>
    <s:file name="upload" label="File" />
    <s:submit/>
</s:form>

二传手

public void setUploadFileName(String filename) {
        this.filename = filename;
    }

这是portlet模式下的错误,还是我缺少一个关键依赖项、一个组件、版本?替代方法?

在图像中,文件是JSR168调度程序中的断点。在JSR168调度程序中服务器.断点之后运行的第一个代码

共有1个答案

颜新
2023-03-14

本例中的解决方案是后退一步,查看请求中存在的内容。运行portlet的CMS实际上在上传到达portlet环境之前负责上传。我发现的jakarta包装是由CMS创建的,但它不在portlet范围内。

解决方案:

   public String intercept(ActionInvocation invocation) throws Exception {
        final ActionContext context = invocation.getInvocationContext();

        Object action = invocation.getAction();
        try {
            if (action instanceof FileUploadAware) {
                HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);
//                if (request instanceof MultipartRequestWrapper) {
                    File file = (File) request.getAttribute("upload");
                    ((FileUploadAware) action).setFile(file);

//                }
            }
        }catch (Exception e){
            LOG.error("Exception? {}", e);
        }finally {
            return invocation.invoke();
        }

这不是一个最终的解决方案,而是一个概念,一个拦截器,它在请求中找到一个上传属性,并将其放在FileUploadAware操作中。该属性是CMS截获并创建的本地临时文件。这对我有用,是CMS的特殊解决方案还是Portlet的通用解决方案?不知道。

 类似资料:
  • 我正在尝试使用struts2 fileUpload拦截器在我的web应用程序中实现文件上载过程。下面是我的代码 指数jsp struts.xml 文件上传操作。JAVA 当我在index.jsp页面中选择一个pdf文件并单击上传按钮时,它给操作类的fileUpload字段赋予了空值。 我在调试模式下执行应用程序,并给出了这个 检查它返回的内容,我得到空值。

  • 问题内容: 问题描述:我想使用JSP创建文件上传屏幕。屏幕将允许用户在屏幕上选择多个文件,但所有文件只有一个“上传”按钮。单击上载按钮后,应在Action类中获取所有文件对象。 但是重要的是页面提交后不应刷新。在同一屏幕上还会显示其他信息,在文件上传过程中不应更改这些信息。 我的尝试:我使用了简单的struts2文件上传功能,效果很好。但是它正在刷新提交页面。我使用AJAX(JQuery)来解决此

  • 介绍 (Introduction) FileUpload小部件包装HTML“input type ='file'”元素。 如果要将其提交到服务器,则必须将此窗口小部件与FormPanel一起使用。 Class 声明 (Class Declaration) 以下是com.google.gwt.user.client.ui.FileUpload类的声明 - public class FileUploa

  • 使用最为广泛的Java文件上传组件,Struts本身采用这个包来处理文件上传。文档非常详细、简单易用。 JavaDoc:http://www.ostools.net/apidocs/apidoc?api=commons-fileupload

  • 本文向大家介绍java组件fileupload文件上传demo,包括了java组件fileupload文件上传demo的使用技巧和注意事项,需要的朋友参考一下 在我们的web开发中,很多的时候都需要把本机的一些文件上传到web服务器上面去。 如:一个BBS系统,当用户使用这是系统的时候,能把本机的一些图片,文档上传到服务器上面去。然后其他用户可以去下载这些文件,那么这样的话,我们可以自己编程实现文

  • 主要内容:创建视图文件:,创建action类:,配置文件:,错误消息:Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传。上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的目录,以确保数据不丢失。 请注意,服务器有一个安全策略可能会禁止写到目录以外的临时目录和属于web应用的目录。 在Struts中的文件上传是通过预先定义的拦截文件上传拦截器这是可通过org.apache.struts2.in