如何从Servlet3SecurityContextHolderAwareRequestWrapper中获取MultipartRequest

时间:2014-09-09 02:51:50

标签: grails upload spring-security

我正在使用Grails 2.4.3并且我有<g:uploadForm>方法设置为发布,但我没有在我的控制器操作中获得 MutlipartRequest 。相反,我得到一个没有getFile()方法的 Servlet3SecurityContextHolderAwareRequestWrapper 。我已经尝试过投射,我已经尝试用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>

这是我的控制器动作:

  def uploadSupplemental() {
    MultipartRequest multipartRequest =  request as MultipartRequest
    def file = multipartRequest.getFile('supplementalData')
    if (file){
      flash.message = "File found!!"
    } else {
      flash.message = "File NOT found.  :-( "
    }
    redirect action:'list'
  }

这是我得到的错误:

  

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

2 个答案:

答案 0 :(得分:2)

以下配置属性必须在true中设置为Config.groovy才能启用多部分请求。

grails.web.disable.multipart=true

以下是related JIRA issuea duplicate question in SO报告相同的例外情况。

还要确保在上传操作之前对用户进行了身份验证(使用@Secured)。

答案 1 :(得分:0)

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

我的应用程序中的请求实例的类型与到达服务器的HTTP帖子中的content-type属性有关。所以,如果我在一个enctype属性设置为...

的表单中输入文件
<form enctype="multipart/form-data" action="upload" method="POST">

...我按预期获得了一个MutlipartRequest,可以上传文件request.getFile()

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

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

See the diference between content-type and enctype