2008-10-15 23 views
8

Próbuję emulować kod do wysyłania plików ze strony grails i mam pewne problemy. Używam tego samego kodu, co znaleziony here. Tu jest mój kodu:Problemy z przesyłaniem plików Grailsa

<g:form action="upload" method="post" enctype="multipart/form-data"> 
     <input type="file" name="myFile" /> 
     <input type="submit" value="Upload" /> 
    </g:form> 

i

def upload = { 
    def f = request.getFile('myFile') 
    if(!f.empty) { 
     flash.message = 'success' 
    }  
    else { 
     flash.message = 'file cannot be empty' 
    } 
} 

Otrzymuję następujący błąd w czasie wykonywania:

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"} 

Wydaje się być związane z pewnym konfiguracji wiosennym. Wiosna nie wydaje się być wstrzykiwanie MultipartHttpServletRequest, więc moje żądanie nie ma odpowiedniej metody. Właśnie stworzyłem te aplikacje przy użyciu grails create-app. Nie zmodyfikowałem pliku resourcesroroy. Używam grails 1.0.3.

Każda pomoc jest doceniana. Witryna grails sprawia, że ​​wygląda to tak łatwo.

Odpowiedz

12

Problem rozwiązany!

Użyłem przykładowy kod do przesyłania plików do Grails inaczej niż oryginalny autor prawdopodobnie przeznaczone. Problem polega na tym, że po wywołaniu metody kontrolera, czasami było to pierwotne renderowanie strony Upload. Żądanie w tej metodzie nie było typu MultipartHttpServletRequest. Kiedy zrobiłem POST z moim plikiem do przesłania, wtedy Spring zrobił poprawną rzecz i zmienił moją prośbę na MultipartHttpServletRequest. Tak więc musiałem wykonać prosty test w mojej metodzie sterownika update przed użyciem mojego żądania jak 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' 
+0

Och, tak ... nigdy nie chcesz pozwolić na POST i GET z tego samego zamknięcia akcji, tylko dla tego rodzaju rzeczy. – billjamesdev

+0

Jeśli ktoś szuka sposobu na sprawdzenie tego, tutaj jest dobry link http://roshandawrani.wordpress.com/2011/02/03/grails-mock-testing-a-file-upload/ dzięki Roshanowi – rsilva4

4

upewnij się zaktualizować html (Twój GSP z formularza, aby przesłać z), aby mieć enctype jak pokazują one:

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

Nadzieja, że ​​jest pomocne, wydaje się zbyt oczywiste, ale to moja pierwsza myśl po wyświetleniu komunikatu o błędzie.

+0

Mam to, ale nadal nie działa. Dodałem mój dokładny kod do mojego pierwotnego postu powyżej. – anschoewe

+0

dziękuję, zobacz twoją aktualizację ... próbując przekopać ... czy to jest dziwne, że Żądanie jest specyficzne dla Jetty, a nie tylko HttpRequest ... – codeLes

+0

Co prawda jestem nowy w Grails. Zakładałem, że od kiedy uruchamiałem swoją aplikację za pomocą Jetty, to było normalne, że żądałem od typu Jetty. – anschoewe

2

Ktoś, kogo here wydaje się mieć takie same problemy, jakie miałeś. Mówi, że "naprawił" to:

Rozwiązany. To był mój błąd, zapisałem akcję przed wysłaniem formularza, więc przypuszczam, że nie było pliku.

Nie wiem, jak wziąć to, co powiedział, ale może ci to pomoże.

+0

zobaczyłem to, ale nie miałem pojęcia, jak to przekazać ... inny facet mówi, że zrobił porządek i wyczyścił swoją skrzynkę podręczną i zadziałało ... nie jestem pewien ...ale to zadziałało dla niego jakoś – codeLes

+0

Nie jestem pewien, jak podejdę do akcji przed jej przesłaniem. Czy to możliwe? Oczyściłem swoje aplikacje (grails clean), ale nie wiem, jak wyczyścić pamięci podręczne. – anschoewe

4

Teraz z Grails użytku 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 } 
} 

bardziej czyste, bardziej proste.