Pregunta

Estoy tratando de emular el código de carga de archivos del sitio web de Grails, y tengo algunos problemas. Estoy usando el mismo código que se encuentra aquí . Aquí está mi código:

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

y

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

Recibo el siguiente error en tiempo de ejecución:

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

Parece estar relacionado con alguna configuración de Spring. Spring no parece estar inyectando MultipartHttpServletRequest , por lo que mi solicitud no tiene el método apropiado. Acabo de crear estas aplicaciones utilizando grails create-app . No he modificado el archivo resources.groovy. Estoy usando grails 1.0.3.

Cualquier ayuda es muy apreciada. El sitio web de Grails hace que esto parezca tan fácil.

¿Fue útil?

Solución

¡Problema resuelto!

Estaba usando el código de ejemplo para subir archivos a Grails de manera diferente a la que pretendía el autor original. El problema es que cuando se llamó al método upload del controlador, a veces era para el render original de la página Upload. La solicitud en ese método no era del tipo MultipartHttpServletRequest. Cuando hice un POST con mi archivo para cargar, Spring hizo lo correcto y cambió mi solicitud a MultipartHttpServletRequest. Por lo tanto, necesitaba hacer una comprobación simple en mi actualización método del controlador antes de usar mi solicitud como 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'

Otros consejos

Ahora con el uso de 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 }
}

Más limpio, más simple.

asegúrese de actualizar el html (su gsp con el formulario para cargar) para tener el enctype como se muestra:

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

Espero que sea útil, parece demasiado obvio pero es mi primer pensamiento después de ver su mensaje de error.

Alguien aquí parece tener los mismos problemas que tú. Él dice que él " arreglado " it:

  

Resuelto. Fue mi error, estaba yendo en acción, antes de enviar el formulario, así que supongo que no había ningún archivo.

No estoy seguro de cómo tomar lo que dijo, pero quizás te ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top