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

    mam to GSP:Jak iteracyjne nad przesłanych plików w 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> 
    

    Ale gdy próbowałem wyświetlić wynik w kontroler wpisując:

    render(params); 
    return true; 
    

    Mam ten wynik:

    "documentFile":[email protected]4dcf95 
    

    Jak czytać każdy przesyłany plik? Czy mogę uzyskać następujące informacje?

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

    PS: Używam Grails 1.2.2

    +0

    Czy masz zmienną liczbę plików w swojej formie, czy będzie to zawsze cztery? Jeśli jest zmienna, odpowiednio zaktualizuję swoją odpowiedź. –

    +0

    jest zmienna. Dodałem numer na końcu nazwy ... ale wciąż jest to dziwne, ponieważ po wpisaniu wiele razy wygeneruje tablicę "czegoś" w parametrach. – nightingale2k1

    +0

    Tak, przeglądałem interfejs API Grails i nie mogłem znaleźć metody, która pobiera obiekt File [] na podstawie danych wejściowych pliku. Interfejs API Servlet udostępnia metodę przechwytywania tablicy String [], ale nie przyjrzałem się jej źródłowi, aby zobaczyć, jak to działa. Prawdopodobnie można to zrobić za pomocą ręcznej pracy nad żądaniem HTTP, ale to chyba za dużo pracy. Używanie 'request.fileNames 'Grails jest prawdopodobnie rozsądnym odpowiednikiem. –

    Odpowiedz

    6

    pierwsze, będziesz musiał dać unikalne nazwy dla każdego z wejść plików:

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

    wówczas w kontrolerze, można użyć:

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

    Jestem całkiem pewien, że twoje name atrybuty muszą być unikatowe. Nie mogę znaleźć niczego w API, które pozwoli ci uzyskać tablicę plików, które zostały przesłane z tym samym wejściem name.

    Referencje:

    +0

    Rok później to rozwiązanie wciąż było pomocne. Dzięki Rob! – Joseph

    +0

    Więc nie mogę użyć ''? –

    +0

    Nie wierzę w to. To znaczy, możesz, ale to nie będzie działać tak jak PHP. Nadal będziesz w stanie iterować nad 'fileNames', aby osiągnąć w zasadzie to samo. –

    6

    Począwszy Grails 1.2 (wiosna 3.0), można uzyskać dostęp do wielu plików z wejściami o tej samej nazwie (lub użyć HTML5 multiple atrybut) z właściwością multiFileMap obiektu kontrolera request (gdy żądanie jest postem wieloczęściowym, obiekt request będzie stanowisko MultipartRequest). Dzięki czemu można uzyskać dostęp do listy MultipartFile obiektów o określonej nazwie wejściowego (tzn documentFile) jak poniżej:

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

    lub dostępu wszystkich obiektów MultipartFile z wszystkich wejść tak:

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

    Edycja 2013-02-08: Brian Adams:

    W powyższym przykładzie mogę uzyskać dostęp do wszystkich Mul tipartOdpady plików ze wszystkich wejść na mojej stronie internetowej. Ale chcę, aby pliki z dowolnego wejścia były wielokrotne. Ex: Mam nazwę wejściową: "uploadFiles" i chcę pobrać wszystkie pliki z tego znacznika wejściowego. Możesz mi pomóc?

    Brian, myślę, że to, czego chcesz, to pierwsza wersja powyższego.Jeśli plik wejściowy jest nazwany „uploadFiles”, a następnie można uzyskać do niego dostęp z multiFileMap pomocą „uploadFiles” klucz:

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