Grails 文件上传问题
Posted
技术标签:
【中文标题】Grails 文件上传问题【英文标题】:Grails File Upload Problems 【发布时间】:2010-09-17 09:35:50 【问题描述】:我正在尝试从 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 网站让这看起来很简单。
【问题讨论】:
【参考方案1】:问题解决了!
我使用示例代码将文件上传到 Grails 与原作者可能的预期不同。问题是,当调用控制器的 upload 方法时,有时是为了上传页面的原始渲染。该方法中的请求不是 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'
【讨论】:
哦,是的......你永远不想允许 POST 和 GET 从同一个动作闭包中,只是为了这种事情。 如果有人正在寻找如何测试这里是一个很好的链接roshandawrani.wordpress.com/2011/02/03/… 感谢 Roshan【参考方案2】:现在使用 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
更干净,更简单。
【讨论】:
【参考方案3】:确保您更新了 html(您的 gsp 以及要从其上传的表单)以具有 enctype,如下所示:
<g:form action="upload" method="post" enctype="multipart/form-data">
希望这有帮助,似乎太明显了,但这是我看到您的错误消息后的第一个想法。
【讨论】:
我有,但还是不行。我已将我的确切代码添加到上面的原始帖子中。 谢谢,看到你的更新...试图挖掘...奇怪的是,请求是特定于码头的,而不仅仅是一个 HttpRequest... 诚然,我是 Grails 的新手。我假设由于我使用 Jetty 运行我的应用程序,因此请求类型为 Jetty 是正常的。【参考方案4】:某人here 似乎遇到了与您相同的麻烦。他说他“修复”了它:
解决了。这是我的错误,我在提交表单之前进行了保存,所以我想没有文件。
不知道如何理解他说的话,但也许它会对你有所帮助。
【讨论】:
看到了,但不知道如何沟通...另一个人说他清理并清除了他的缓存并且它有效...不确定...但它有效他以某种方式 我不确定在提交之前如何执行操作。这可能吗?我已经清理了我的应用程序(grails clean),但我不知道如何清理缓存。以上是关于Grails 文件上传问题的主要内容,如果未能解决你的问题,请参考以下文章