【问题标题】:How to get a MultipartHttpServletRequest from RequestContextHolder?如何从 RequestContextHolder 获取 MultipartHttpServletRequest?
【发布时间】:2011-07-08 18:06:09
【问题描述】:

我已将访问决策管理器配置为在 servlet 处理请求之前检查请求,关键行是:-

HttpServletRequest request = (HttpServletRequest) RequestContextHolder.currentRequestAttributes().getRequest(); 

一切都好。但是,当请求是enctype="multipart/form-data" 时,当RequestContextHolder.currentRequestAttributes().getRequest() 只返回HttpServletRequest 时,我如何获取MultipartHttpServletRequest

我使用的是 spring 2.5。

【问题讨论】:

    标签: java spring-mvc multipartform-data


    【解决方案1】:

    MultipartHttpServletRequest 是用于处理多部分表单提交的 Spring 特定接口。默认实现是DefaultMultipartHttpServletRequest,它有一个接受HttpServletRequest的构造函数。

    所以:

    HttpServletRequest originalRequest = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
    MultipartHttpServletRequest multiPartRequest = new DefaultMultipartHttpServletRequest(originalRequest);
    

    【讨论】:

    • 嗨斯卡夫曼。谢谢回复。我正在使用 Spring 2.5 我没有 RequestContextHolder.currentRequestAttributes().getRequest();方法。
    • @user456147:我从你的问题中复制了它:) 不管怎样,看看我的编辑。
    【解决方案2】:

    除了拥有

    <form method=<method> action=<url> enctype="multipart/form-data"></form>
    

    你必须拥有

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
    

    在你的 spring 配置文件中。

    这是一个很好的教程

    http://techdive.in/spring/spring-file-upload

    【讨论】:

      【解决方案3】:

      您是否尝试过投射到MultipartHttpServletRequest

      【讨论】:

      • 嗨,伙计。我不相信可以将 HttpServletRequest 转换为 MultipartServletRequest。还是只是迟到了,我错过了一些东西:-)
      • 假设您指的是 Spring 的 MultipartHttpServletRequest,它确实扩展了 HttpServletRequest。
      • 这是异常 java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.MultipartHttpServletRequest 这是代码 ServletRequestAttributes attr2 = (ServletRequestAttributes ) RequestContextHolder.currentRequestAttributes(); boolean isMultipart = ServletFileUpload.isMultipartContent(request); if(isMultipart) { MultipartHttpServletRequest sess2= (MultipartHttpServletRequest) attr2.getRequest(); System.out.println("IDDD"+sess2.getParameter("scriptId")); }
      【解决方案4】:

      如果你使用的是spring-mvc,请确保你把这一行

      <bean id="multipartResolver"
            class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
      

      在您的 app-config.xml 中。

      这对我有用。

      【讨论】:

        【解决方案5】:

        我认为您无法从 RequestContextHolder 中获取 DefaultMultipartHttpServletRequest。 DefaultMultipartHttpServletRequest 真正实现了 HttpServletRequest。 但是如果您使用 CommonsMultipartResolver,则有 2 个请求实例。一个是 DefaultMultipartHttpServletRequest 实例,另一个是 HttpServletRequest 实例。 实际上我不知道如何从 RequestContextHolder 中获取第一个实例。您可以从中获取第二个实例。

        【讨论】:

          猜你喜欢
          • 2014-01-07
          • 1970-01-01
          • 2022-06-20
          • 1970-01-01
          • 2020-10-01
          • 2011-11-28
          • 2020-08-26
          • 2021-04-18
          • 1970-01-01
          相关资源
          最近更新 更多