Grails 如何从Servlet3Security ContextHolderAwareRequestWrapper中获取多部分请求

Grails 如何从Servlet3Security ContextHolderAwareRequestWrapper中获取多部分请求,grails,upload,spring-security,Grails,Upload,Spring Security,我使用的是Grails2.4.3,我有一个,方法设置为post,但我的控制器操作中没有MutlipartRequest。相反,我得到的是一个Servlet3SecurityContextHolderAwareRequestWrapper,它没有getFile()方法。我尝试过使用request.request,从包装器中取出请求,尝试过一些我见过的类似问题的其他建议,但仍然没有成功。我肯定我错过了一些简单的东西。我倾向于这样做,但如果有人能给我指出正确的方向,我将非常感激 这是我的表格: &

我使用的是Grails2.4.3,我有一个
,方法设置为post,但我的控制器操作中没有MutlipartRequest。相反,我得到的是一个Servlet3SecurityContextHolderAwareRequestWrapper,它没有
getFile()
方法。我尝试过使用
request.request
,从包装器中取出请求,尝试过一些我见过的类似问题的其他建议,但仍然没有成功。我肯定我错过了一些简单的东西。我倾向于这样做,但如果有人能给我指出正确的方向,我将非常感激

这是我的表格:

  <g:uploadForm method="POST" action="uploadSupplemental" >
    <div class="modal-header">
      <h3 class="modal-title" id="myModalLabel">Upload Supplemental Data File</h3>
    </div>
    <div class="modal-body">
      <label for="fileInput">Choose file to upload:</label>
      <input type="file" id="fileInput" name="supplementalData" />
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
      <input type="submit" class="btn btn-primary" />
    </div>
  </g:uploadForm>
下面是我得到的错误:

URI/app/upload/upload补充类 groovy.lang.MissingMethodException消息没有方法签名: org.springframework.security.web.servletapi.HttpServlet3RequestFactory$Servlet3SecurityContextHolderAwareRequestWrapper.getFile() 适用于参数类型:(java.lang.String)值: [补充数据]可能的解决方案:getXML(), getPart(java.lang.String)、getAt(java.lang.String), getAt(java.lang.String)、getLocale()、getJSON()


要启用多部分请求,必须在
config.groovy
中将以下config属性设置为
true

grails.web.disable.multipart=true
下面是一个报告相同异常的示例


在上传操作之前,还要确保用户已通过身份验证(使用
@Secured
)。

我在grails应用程序中遇到了完全相同的错误,并提出了以下解决方案:

我的应用程序中请求实例的类型与到达服务器的HTTP post中的content type属性相关。所以,如果我在一个表单中输入了一个文件,并将enctype属性设置为

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

。。。我按预期得到了一个MutlipartRequest,可以通过调用
request.getFile()
获得上传的文件

但是,如果HTTP post的内容类型为“application/octet stream”(就像我们使用Valum的AJAX文件上载程序上载单个文件一样),那么请求本身就是一个二进制文件,可以通过调用
request.getInputStream()
转换为InputStream

因此,如果您不确定应用程序中使用的内容类型,我建议您使用firebug之类的浏览器工具进行检查,然后尝试
request.getInputStream()
直接从请求中获取文件


更多信息:第一次访问请求时,在控制器操作中,请求的类型为:org.springframework.security.web.servletapi.HttpServlet3RequestFactory$Servlet3SecurityContextHolderAwareRequestWrapper。如果我调用getRequest(),就会得到org.springframework.security.web.context.HttpSessionSecurityContextRepository$Servlet3SaveToSessionRequestWrapper。仍然是一个包装器,所以我调用getRequest,得到org.springframework.security.web.firewall.RequestWrapper,另一个包装器。(续…)再调用org.springframework.security.web.firewall.RequestWrapper.getRequest,我就会得到org.apache.catalina.core.ApplicationHttpRequest。所以我终于有了一个请求对象,但它不是应该是的MultipartRequest。仍然有问题。在
Config.groovy
中设置的
grails.web.disable.multipart
的值是多少?这里有一个相关的和一个报告相同的异常。在上传操作之前,还要确保用户已通过身份验证。确定控制器中使用了
@Secured
。@dmahapatro,成功了。谢谢你能把这个写进答案吗?完成了。很高兴挖掘有用。:)此解决方案不适用于我,但我没有安全的注释,但我还获得了HttpServlet3RequestFactory$Servlet3SecurityContextHolderAwareRequestWrapper。如何解决这个问题?注意:上传可以在桌面上进行,但不能在手机上进行
<form enctype="multipart/form-data" action="upload" method="POST">