Domanda

Sto cercando di emulare il codice di caricamento del file dal sito Web Grails e sto riscontrando alcuni problemi. Sto usando lo stesso codice trovato qui . Ecco il mio codice:

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

e

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

Ricevo il seguente errore in fase di esecuzione:

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

Sembra essere correlato a una configurazione Spring. Spring non sembra iniettare MultipartHttpServletRequest , quindi la mia richiesta non ha il metodo appropriato. Ho appena creato queste applicazioni usando grails create-app . Non ho modificato il file resources.groovy. Sto usando grails 1.0.3.

Qualsiasi aiuto è molto apprezzato. Il sito Web Grails rende questo aspetto così semplice.

È stato utile?

Soluzione

Problema risolto!

Stavo usando il codice di esempio per caricare file su Grails in modo diverso da quello che probabilmente l'autore originale intendeva. Il problema è che quando veniva chiamato il metodo upload del controller, a volte era per il rendering originale della pagina di Upload. La richiesta in quel metodo non era di tipo MultipartHttpServletRequest. Quando ho fatto un POST con il mio file da caricare, Spring ha fatto la cosa giusta e ha cambiato la mia richiesta in MultipartHttpServletRequest. Quindi, ho dovuto fare un semplice controllo nel mio metodo di controller update prima di utilizzare la mia richiesta come un 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'

Altri suggerimenti

Ora con Grails 2.x usa:

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

Più pulito, più semplice.

assicurati di aggiornare l'html (il tuo gsp con il modulo da cui caricare) per avere il enctype come mostrano:

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

Spero che sia utile, sembra troppo ovvio ma è il mio primo pensiero dopo aver visto il tuo messaggio di errore.

Qualcuno qui sembra avere gli stessi problemi che hai avuto. Dice che "riparato" esso:

  

risolto. È stato un mio errore, stavo andando in azione salvo prima di inviare il modulo, quindi suppongo che non vi fosse alcun file.

Non sono sicuro di come prendere ciò che ha detto, ma forse ti aiuterà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top