首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileUpload,Struts2,FileUploaderInterceptor中没有文件

FileUpload,Struts2,FileUploaderInterceptor中没有文件
EN

Stack Overflow用户
提问于 2019-04-11 10:54:12
回答 1查看 588关注 0票数 0

在portlet模式下,有一个可以工作的Struts2 portlet环境,其中我无法使Struts fileUpload工作。

我看得出来

  • 一个文件被上传到服务器,在临时空间中创建。
  • 在原始请求上存在一个多部分请求,其中包含文件名和文件内容,其中它进入Struts类。
  • 我可以触发最大大小响应,这是Struts中的默认值。
  • FileUploadInterceptor被触发,但是在雅加达MultipartRequest中没有文件。在原始请求和雅加达包装器之间,文件丢失了。

我在一个剥离的Spring 2应用程序中尝试了同样的方法,这个问题与主项目中的问题相同。遵循以下代码

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

用于JSP和操作类。portlet被创建,流程工作,但在操作中没有文件。

标准Sping Boot 2有额外的pom:

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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>

以及形式

代码语言:javascript
复制
<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>

策划人

代码语言:javascript
复制
public void setUploadFileName(String filename) {
        this.filename = filename;
    }

这是portlet模式中的一个bug,还是缺少了一个键依赖项、组件、版本?另一种方法?

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

EN

回答 1

Stack Overflow用户

发布于 2019-04-19 07:31:10

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

解决方案:

代码语言:javascript
复制
   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();
        }

这不是最后的解决方案,而是一个拦截器,它在请求中找到一个upload属性,并将其放到一个FileUploadAware操作中。属性是CMS截获并创建的本地临时文件。对于我来说,这是一个针对CMS的特殊解决方案,还是一个用于portlet的通用解决方案?不知道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55630802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档