2010-09-14 7 views
6

Ich habe dieses GSP:Wie iterieren hochgeladenen Dateien 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> 

Aber wenn ich durch die Eingabe des Ergebnisses in Controller anzuzeigen versucht:

render(params); 
return true; 

Ich habe dieses Ergebnis:

Wie lese ich jede Datei, die hochgeladen wird? Kann ich Folgendes bekommen?

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

ps: Ich bin Grails 1.2.2

+0

Haben Sie eine variable Anzahl von Dateien in Ihrem Formular haben, oder wird es immer vier sein? Wenn es variabel ist, werde ich meine Antwort entsprechend aktualisieren. –

+0

es ist variabel. Ich habe am Ende des Namens eine Zahl hinzugefügt ... aber es ist immer noch komisch, denn wenn man schreibt, erzeugt es oft ein Array von "etwas" in params. – nightingale2k1

+0

Ja, ich habe die Grails API durchsucht und konnte keine Methode finden, die ein File [] Objekt basierend auf Dateieingaben abruft. Die Servlet-API stellt die Methode zum Abrufen des Arrays String [] bereit, aber ich habe die Quelle nicht untersucht, um zu sehen, wie sie es tut. Vermutlich könnte es mit manueller Arbeit an der HTTP-Anfrage gemacht werden, aber das ist wahrscheinlich zu viel Arbeit. Die Verwendung von "request.fileNames" von Grails ist wahrscheinlich ein sinnvolles Äquivalent. –

Antwort

6

Zuerst verwenden Sie einen eindeutigen Namen für jede Ihrer Datei-Eingänge geben müssen:

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

Dann in Ihrem Controller, Sie verwenden können:

// access each file by name 
File file = request.getFile('documentFile1') 

// or iterate through them 
request.fileNames.each { 
    File file = request.getFile(it) 
} 

ich bin mir ziemlich sicher, dass Ihre name Attribute eindeutig sein. Ich kann in der API nichts finden, mit dem Sie ein Array von Dateien erhalten können, die mit der gleichen Eingabe name hochgeladen wurden.

Referenzen:

+0

Ein Jahr später und diese Lösung war immer noch hilfreich. Danke Rob! – Joseph

+0

Also kann ich '' nicht verwenden? –

+0

Ich glaube nicht. Ich meine, Sie können, aber es funktioniert nicht genau wie PHP. Sie können immer noch über 'fileNames' iterieren, um im Wesentlichen dasselbe zu erreichen. –

6

Beginnend mit Grails 1.2 (Feder 3.0), können Sie mehrere Dateien von Eingaben mit demselben Namen (oder die Verwendung der HTML5 multiple zugreifen können Attribut) mit der multiFileMap Eigenschaft des Controllers request Objekt (wenn die Anfrage ein mehrteiliges Formular ist, wird das request Objekt ein in sein Stand von MultipartRequest). So können Sie die Liste der MultipartFile Objekte zugreifen für einen bestimmten Eingangsnamen (dh documentFile) wie folgt aus:

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

Oder Zugriff alle MultipartFile Objekte aus allen Eingängen wie folgt aus:

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

bearbeiten 2013-02-08: Brian Adams fragt:

Im obigen Fall kann ich auf alle Mul zugreifen tipartFile Objekte von allen Eingaben auf meiner Webseite. Aber ich möchte, dass Dateien von jedem Eingang mehrere sind. Bsp: Ich habe Eingabe Name ist: "uploadFiles", und ich möchte alle Dateien von diesem Input-Tag any. Kannst du mir helfen?

Brian, ich denke, was Sie wollen, ist die erste Version der oben genannten.Wenn Ihre Datei Eingang „uploadFiles“ genannt wird, dann können Sie darauf zugreifen aus dem multiFileMap mit dem „uploadFiles“ -Taste:

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