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 文件上传问题的主要内容,如果未能解决你的问题,请参考以下文章

大型文件上传期间的 Grails 连接超时

Grails3文件上传maxFileSize限制

grails中内存上传文件大小的变化

Grails文件上传:视图渲染时如何设置输入文件的值

Grails 文件上传未使用正确的内容类型

Grails 中的多个文件上传