2008-10-15 159 views
8

我試圖模仿Grails網站上的文件上傳代碼,我遇到了一些問題。我使用的代碼與here相同。這裏是我的代碼:Grails文件上傳問題

<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配置。春天似乎沒有注入MultipartHttpServletRequest,所以我的請求沒有適當的方法。我剛剛使用grails create-app創建了這個應用程序。我沒有修改resources.groovy文件。我正在使用grails 1.0.3。

任何幫助,非常感謝。 grails網站使這看起來很容易。

回答

12

問題解決了!

我使用的示例代碼將文件上傳到Grails的方式與原作者可能的不同。問題是,當控制器的方法被調用時,有時是上傳頁面的原始呈現。該方法中的請求不是MultipartHttpServletRequest類型。當我用我的文件上傳POST時,Spring做了正確的事情,並將我的請求改爲MultipartHttpServletRequest。因此,在使用我的請求(如MultipartHttpServletRequest)之前,我需要在我的更新控制器方法中進行簡單檢查。

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' 
4

確保您更新HTML(您的普惠制與形式從上傳)有ENCTYPE,因爲他們顯示:

<g:form action="upload" method="post" enctype="multipart/form-data"> 

希望這是有幫助的,似乎是太明顯,但它是我的第一個念頭看到你的錯誤信息後。

+0

我有,但它仍然無法正常工作。我已將我的確切代碼添加到上面的原始帖子中。 – anschoewe 2008-10-15 20:24:48

+0

謝謝,看看你的更新...試圖挖掘...這是奇怪的請求是特定於Jetty而不僅僅是一個HttpRequest ... – codeLes 2008-10-15 20:27:02

+0

無可否認我是新來的Grails。我假設自從我使用Jetty運行我的應用程序時,對於類型爲Jetty的請求來說是正常的。 – anschoewe 2008-10-15 20:43:27

2

某人here似乎有同樣的麻煩,你有。他說他「固定」它:

已解決。這是我的錯誤,我在提交表單前先行動,所以我想沒有文件。

不知道如何採取他所說的話,但也許它會幫助你。

4
與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 } 
} 

更清潔,更簡單。