2008-10-15 35 views
8

Intento emular el código de carga de archivos del sitio web de grails, y tengo algunos problemas. Estoy usando el mismo código que encontré here. Aquí está mi código:Problemas de carga de archivos de Grails

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

Estoy recibiendo 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 primavera. Spring no parece estar inyectando MultipartHttpServletRequest, por lo que mi solicitud no tiene el método apropiado. Acabo de crear estas aplicaciones usando 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 se vea tan fácil.

Respuesta

12

¡Problema resuelto!

Estaba usando el código de ejemplo para cargar archivos en Grails de forma diferente al autor original probablemente intencionado. El problema es que cuando se llamaba al método de carga del controlador, a veces era para el renderizado original de la página Cargar. La solicitud en ese método no era del tipo MultipartHttpServletRequest. Cuando hice una POST con mi archivo para cargar, Spring hizo lo correcto y cambió mi solicitud a MultipartHttpServletRequest. Entonces, necesitaba hacer una simple comprobación en mi update método de control antes de usar mi solicitud como 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

Oh, ya .... nunca quieres permitir POST y GET desde el mismo cierre de acción, solo para este tipo de cosas. – billjamesdev

+0

Si alguien está buscando cómo probar esto aquí hay un buen enlace http://roshandawrani.wordpress.com/2011/02/03/grails-mock-testing-a-file-upload/ gracias a Roshan – rsilva4

4

Asegúrese de actualizar el código HTML (el SGP con la forma de subir de) tener la enctype ya que muestran:

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

la esperanza de que es muy útil, parece demasiado obvio, pero es mi primer pensamiento después de ver tu mensaje de error.

+0

Lo tengo pero todavía no funciona. He agregado mi código exacto a mi publicación original anterior. – anschoewe

+0

gracias, mira tu actualización ... intentando cavar ... es extraño que la Solicitud sea específica de Jetty y no solo una HttpRequest ... – codeLes

+0

Es cierto que soy nuevo en Grails. Supuse que ya que estaba ejecutando mi aplicación usando Jetty, era normal para la solicitud de tipo Jetty. – anschoewe

2

Alguien here parece estar teniendo los mismos problemas que tenía. Él dice que lo "arregló":

Resuelto. Fue mi error, iba a entrar 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 tal vez te ayude.

+0

vio eso, pero no tenía idea de cómo comunicarlo ... otro tipo dice que hizo una limpieza y limpió su caché y funcionó ... no estoy seguro de eso ...pero funcionó para él de alguna manera – codeLes

+0

No estoy seguro de cómo voy a la acción antes de enviarla. ¿Es esto posible? He limpiado mis aplicaciones (grails clean), pero no sé cómo borrar las cachés. – anschoewe

4

Ahora, con el uso 2.x Grails:

<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 limpia, más simple.