【问题标题】:Grails File Upload ProblemsGrails 文件上传问题
【发布时间】: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 网站让这看起来很简单。

【问题讨论】:

    标签: spring grails file-upload


    【解决方案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),但我不知道如何清理缓存。
      猜你喜欢
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多