Как перебирать загруженные файлы в Grails - PullRequest
7 голосов
/ 14 сентября 2010

У меня есть GSP:

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

Но когда я попытался просмотреть результат в контроллере, набрав:

render(params);
return true;

Я получил такой результат:

"documentFile":org.springframework.web.multipart.commons.CommonsMultipartFile@14dcf95

Как мне прочитать каждый загружаемый файл?Могу ли я получить следующее?

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

ps: я использую grails 1.2.2

Ответы [ 2 ]

6 голосов
/ 25 августа 2011

Начиная с Grails 1.2 (весна 3.0), вы можете получить доступ к нескольким файлам из входов с одинаковым именем (или использующих атрибут HTML5 multiple) с помощью свойства multiFileMap объекта request контроллера (когдаrequest - это сообщение, состоящее из нескольких частей, объект request будет экземпляром MultipartRequest ).Таким образом, вы можете получить доступ к списку MultipartFile объектов для определенного имени входа (например, documentFile) следующим образом:

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

Или получить доступ ко всем объектам MultipartFile из всех входов, например так:

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

Редактировать 2013-02-08: Брайан Адамс спрашивает:

В приведенном выше случае я могу получить доступ ко всем объектам MultipartFile из всех входовна моей веб-странице.Но я хочу получить файлы с любого входа несколько.Пример: у меня есть имя ввода: «uploadFiles», и я хочу получить все файлы из этого тега ввода любой.Можете ли вы помочь мне?

Брайан, я думаю, что вы хотите, это первая версия выше.Если вход вашего файла называется «uploadFiles», то вы можете получить к нему доступ из мультифайловой карты, используя клавишу «uploadFiles»:

def save = {
    List<MultipartFile> files = request.multiFileMap.uploadFiles
    int count = files.findAll { !it.empty }.size
    render "uploaded $count files"
}
6 голосов
/ 14 сентября 2010

Во-первых, вам нужно дать уникальные имена для каждого из ваших файловых входов:

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

Тогда в вашем контроллере вы можете использовать:

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

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

Я почти уверен, что ваши атрибуты name должны быть уникальными. Я не могу найти в API ничего, что позволило бы вам получить массив файлов, которые были загружены с одним и тем же вводом name.

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...