java
  • grails
  • file-upload
  • groovy
  • 2010-09-14 13 views 6 likes 
    6

    tengo este SPG:Cómo iterar sobre los archivos cargados en Grails

    <g:uploadForm name="myForm" action='save'>  
        <input type='file' name='documentFile' value=''/> 
        <input type='file' name='documentFile' value=''/> 
        <input type='file' name='documentFile' value=''/> 
        <input type='file' name='documentFile' value=''/> 
        <input type='submit' value='Submit'/> 
    </g:uploadForm> 
    

    Pero cuando traté de ver el resultado en el controlador escribiendo:

    render(params); 
    return true; 
    

    Me dieron este resultado:

    "documentFile":[email protected]4dcf95 
    

    ¿Cómo leo cada archivo que se está cargando? ¿Podría obtener lo siguiente?

    documentFile:[File,null,File,null] // (if the 2nd and the 4th are not being used) 
    

    PS: Estoy usando Grails 1.2.2

    +0

    ¿Tiene un número variable de archivos en su forma, o va a ser siempre cuatro? Si es variable, actualizaré mi respuesta en consecuencia. –

    +0

    es variable. Agregué el número al final del nombre ... pero sigue siendo raro porque cuando escribe muchas veces producirá una matriz de "algo" en params. – nightingale2k1

    +0

    Sí, estaba buscando a través de la API de Grails y no pude encontrar un método que recupera un objeto File [] basado en entradas de archivos. La API de Servlet proporciona el método para tomar la matriz String [], pero no he buscado su fuente para ver cómo lo hace. Es de suponer que podría hacerse con un poco de trabajo manual en la solicitud de HTTP, pero eso probablemente sea demasiado trabajo. Usar 'request.fileNames' de Grails es probablemente un equivalente razonable. –

    Respuesta

    6

    En primer lugar, tendrá que dar nombres únicos para cada una de las entradas del archivo:

    <g:uploadForm name="myForm" action="save"> 
        <input type="file" name="documentFile1" value=""/> 
        <input type="file" name="documentFile2" value=""/> 
        ... 
    </g:uploadForm> 
    

    Luego, en su controlador, puede utilizar:

    // access each file by name 
    File file = request.getFile('documentFile1') 
    
    // or iterate through them 
    request.fileNames.each { 
        File file = request.getFile(it) 
    } 
    

    estoy bastante seguro de que sus name atributos tienen que ser únicos. No puedo encontrar nada en la API que le permita obtener una matriz de archivos cargados con la misma entrada name.

    Referencias:

    +0

    Un año después y esta solución aún era útil. Gracias Rob! – Joseph

    +0

    Entonces no puedo usar ''? –

    +0

    No lo creo. Quiero decir, puedes, pero no funcionará exactamente como PHP. Todavía podrá iterar sobre 'fileNames' para lograr esencialmente lo mismo. –

    6

    A partir de griales 1.2 (primavera 3.0), puede acceder a varios archivos de entradas con el mismo nombre (o que utilice el HTML5 multiple atributo) con la propiedad multiFileMap del objeto request del controlador (cuando la solicitud es una publicación de formulario multiparte, el objeto request será un postura de MultipartRequest). Para que pueda acceder a la lista de MultipartFile objetos para un nombre específico de entrada (es decir, documentFile) así:

    def save = { 
        List<MultipartFile> files = request.multiFileMap.documentFile 
        int count = files.findAll { !it.empty }.size 
        render "uploaded $count files" 
    } 
    

    o el acceso a todos los objetos MultipartFile de todas las entradas de la siguiente manera:

    def save = { 
        List<MultipartFile> files = request.multiFileMap.collect { it.value }.flatten() 
        int count = files.findAll { !it.empty }.size 
        render "uploaded $count files" 
    } 
    

    Editar 2013-02-08: Brian Adams pregunta:

    En el caso anterior, puedo acceder a todos los Mul tipartFile objetos de todas las entradas en mi página web. Pero quiero obtener archivos de cualquier entrada es múltiple. Ej: Tengo el nombre de entrada es: "uploadFiles", y quiero obtener todos los archivos de esta etiqueta de entrada. ¿Me puedes ayudar?

    Brian, creo que lo que quieres es la primera versión de las anteriores.Si su archivo de entrada se llama "uploadFiles", entonces se puede acceder a él desde el multiFileMap usando los "uploadFiles" clave:

    def save = { 
        List<MultipartFile> files = request.multiFileMap.uploadFiles 
        int count = files.findAll { !it.empty }.size 
        render "uploaded $count files" 
    } 
    
    Cuestiones relacionadas