我正在使用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()
答案 0 :(得分:2)
以下配置属性必须在true
中设置为Config.groovy
才能启用多部分请求。
grails.web.disable.multipart=true
以下是related JIRA issue和a 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()
直接从请求中获取文件。