2008-10-15 17 views
8

File. here ile aynı kodu kullanıyorum. Ben zamanında şu hatayı alıyorumGrails Ben grails web sitesinden dosya yükleme kodunu taklit çalışıyorum ve bazı sorunlarla çalıştırıyorum yükle Sorunları

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

ve

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

: Bazı Bahar yapılandırması ile ilişkili olduğu görünmektedir

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

İşte benim kodudur. İlkbahar MultipartHttpServletRequest enjekte görünmüyor, bu yüzden isteğim uygun yönteme sahip değil. Bu uygulamaları grails create-app kullanarak oluşturdum. Kaynakları değiştirmedim.groovy dosyası. Ben 1.0.3 grails kullanıyorum.

Herhangi bir yardım çok takdir edilmektedir. Grails web sitesi bu görünümü çok kolaylaştırıyor.

cevap

12

Sorun çözüldü!

muhtemelen taşıyan orijinal yazarın farklı Grails dosya yükleme için örnek kod kullanıyordu. Sorun, denetleyicinin yükleme yöntemini çağırdığında, bazen Yükleme sayfasının orijinal haline getirilmesiydi. Bu yöntemdeki istek, MultipartHttpServletRequest türünde değildi. Dosyamı yüklemek için bir POST yaptığımda, Spring doğru şeyi yaptı ve isteğimi MultipartHttpServletRequest olarak değiştirdim. Bu yüzden, bir MultipartHttpServletRequest gibi isteğimi kullanmadan önce update denetleyici yöntemimde basit bir kontrol yapmam gerekiyordu. Grails 2.x kullanımı ile Şimdi

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

Oh, ya da .... aynı eylemden POST ve GET'e asla izin vermek istemezsiniz, sadece bu tür şeyler için. – billjamesdev

+0

Eğer birisi burayı test etmek için iyi bir bağlantı arıyorsanız http://roshandawrani.wordpress.com/2011/02/03/grails-mock-testing-a-file-upload/ Roshan'a teşekkürler – rsilva4

4

onlar göstermek gibi enctype olması html (yüklemek için forma ile GSP) güncellemek emin olun: yararlıdır

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

Umut, çok bariz görünüyor

ama bu benim ilk düşünce hata mesajınızı gördükten sonra.

+0

Bende var ama hala çalışmıyor. Tam kodumu yukarıdaki orijinal gönderime ekledim. – anschoewe

+0

sayesinde kazmak için çalışıyor ... Güncellemenizi bakınız ... o iste İskele özeldir ve sadece bir HttpRequest ... – codeLes

+0

Kuşkusuz Grails yeniyim o wierd edilmektedir. Uygulamamı Jetty kullanarak çalıştırdığımdan beri, Jetty türüne göre isteğin normal olduğunu varsaydım. – anschoewe

2

Birisi here yaşadığınız aynı sıkıntıları yaşıyor gibi görünüyor. Kendisi de bunu "sabit" diyor:

çözüldü. Benim hatamdı, formu göndermeden önce eylem kaydetmeye gidiyordum, bu yüzden dosya olmadığını farz ettim.

Söylediklerinin nasıl alınacağından emin değilsiniz, ancak belki size yardımcı olacaktır.

+0

gördü, ama nasıl iletişim kurulacağı hakkında hiçbir fikrim yoktu ... başka bir adam temiz ve temiz bir önbellek yaptığını söyledi ve işe yaradı ... bundan emin değilim ...ama bir şekilde onun için çalıştı – codeLes

+0

göndermeden önce nasıl eyleme gitmiyorum emin değilim. Bu mümkün mü? Uygulamalarımı temizledim (sınıf temizliği), ancak önbellekleri nasıl temizleyeceğimi bilmiyorum. – anschoewe

4

:

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

, Daha temiz daha basit.