我正在尝试从grails网站模拟文件上传代码,我遇到了一些问题。我使用的代码与here相同。这是我的代码:
<g:form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="myFile" />
<input type="submit" value="Upload" />
</g:form>
和
def upload = {
def f = request.getFile('myFile')
if(!f.empty) {
flash.message = 'success'
}
else {
flash.message = 'file cannot be empty'
}
}
我在运行时收到以下错误:
Message: No signature of method: org.mortbay.jetty.Request.getFile() is applicable for argument types: (java.lang.String) values: {"myFile"}
Caused by: groovy.lang.MissingMethodException: No signature of method: org.mortbay.jetty.Request.getFile() is applicable for argument types: (java.lang.String) values: {"myFile"}
它似乎与某些Spring配置有关。 Spring似乎没有注入MultipartHttpServletRequest
,所以我的请求没有适当的方法。我刚刚使用grails create-app
创建了这个应用程序。我没有修改resources.groovy文件。我正在使用grails 1.0.3。
非常感谢任何帮助。 grails网站让这看起来很容易。
答案 0 :(得分:12)
问题解决了!
我使用示例代码将文件上传到Grails的方式与原作者可能想要的不同。问题是,当调用控制器的上传方法时,有时会出现上传页面的原始渲染。该方法中的请求不是MultipartHttpServletRequest类型。当我用我的文件上传POST时,Spring做了正确的事情并将我的请求改为MultipartHttpServletRequest。因此,在使用我的请求(如MultipartHttpServletRequest)之前,我需要在 update 控制器方法中进行简单检查。
if(request instanceof MultipartHttpServletRequest)
{
MultipartHttpServletRequest mpr = (MultipartHttpServletRequest)request;
CommonsMultipartFile f = (CommonsMultipartFile) mpr.getFile("myFile");
if(!f.empty)
flash.message = 'success'
else
flash.message = 'file cannot be empty'
}
else
flash.message = 'request is not of type MultipartHttpServletRequest'
答案 1 :(得分:5)
现在使用Grails 2.x:
<g:uploadForm name="upload" action="upload" method="POST">
<input type="file" name="file" />
</g:uploadForm>
def upload = {
def file = request.getFile('file')
assert file instanceof CommonsMultipartFile
if(!file.empty){ //do something }
else { //do something }
}
更干净,更简单。
答案 2 :(得分:4)
请确保您更新html(您的gsp以及要从中上传的表单),以便显示 enctype :
<g:form action="upload" method="post" enctype="multipart/form-data">
希望这很有帮助,看起来太明显但是在看到你的错误信息之后,这是我的第一个想法。
答案 3 :(得分:2)