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

    ho questo GSP:Come iterare su file caricati in 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> 
    

    Ma quando ho cercato di visualizzare il risultato controller digitando:

    render(params); 
    return true; 
    

    ho ottenuto questo risultato:

    "documentFile":[email protected]4dcf95 
    

    Come leggere ogni file che viene caricato? Posso ottenere quanto segue?

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

    ps: sto usando graal 1.2.2

    +0

    Hai un numero variabile di file nel modulo, o sarà sempre a quattro? Se è variabile, aggiornerò la mia risposta di conseguenza. –

    +0

    è variabile. Ho aggiunto un numero alla fine del nome ... ma è ancora strano perché quando digiti molte volte produrrà array di "qualcosa" in params. – nightingale2k1

    +0

    Sì, stavo guardando attraverso l'API Grails e non sono riuscito a trovare un metodo che recuperi un oggetto File [] in base agli input dei file. L'API Servlet fornisce il metodo per l'acquisizione dell'array String [], ma non ho guardato il suo codice sorgente per vedere come funziona. Presumibilmente si potrebbe fare con un po 'di lavoro manuale sulla richiesta HTTP, ma probabilmente è troppo lavoro. L'uso di 'request.fileNames' di Grails è probabilmente un equivalente ragionevole. –

    risposta

    6

    In primo luogo, è necessario dare un nome univoco a ciascuno dei vostri ingressi di file:

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

    Poi nel controller, è possibile utilizzare:

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

    sono abbastanza sicuro che i name attributi devono essere unici. Non riesco a trovare nulla nell'API che ti consenta di ottenere una serie di file che sono stati caricati con lo stesso input name.

    Riferimenti:

    +0

    Un anno dopo e questa soluzione era ancora utile. Grazie Rob! – Joseph

    +0

    Quindi non posso usare ''? –

    +0

    Non ci credo. Voglio dire, puoi, ma non funzionerà esattamente come PHP. Sarai comunque in grado di scorrere su 'fileNames' per realizzare essenzialmente la stessa cosa. –

    6

    Partendo graal 1.2 (primavera 3.0), è possibile accedere a più file da ingressi con lo stesso nome (o che utilizzare il HTML5 multiple attributo) con la proprietà multiFileMap dell'oggetto request del controller (quando la richiesta è un post modulo multiplo, l'oggetto request sarà un posizione di MultipartRequest). Così si può accedere all'elenco dei MultipartFile oggetti per un nome specifico di input (cioè documentFile) come questo:

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

    o l'accesso a tutti gli oggetti MultipartFile da tutti gli ingressi in questo modo:

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

    Edit 2013-02-08:

    Nel caso di cui sopra, posso accedere a tutti i Mul tipartFile oggetti da tutti gli ingressi sulla mia pagina web. Ma voglio ottenere file da qualsiasi input è multiplo. Es: Ho il nome di input è: "uploadFiles", e voglio ottenere tutti i file da questo tag di input any. Mi potete aiutare?

    Brian, penso che ciò che si vuole è la prima versione di quanto sopra.Se il file di input è denominato "uploadFiles", allora si può accedere dal multiFileMap utilizzando il "uploadFiles" chiave:

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

     Problemi correlati

    • Nessun problema correlato^_^