如何在Grails中迭代上传的文件

nig*_*2k1 7 java grails groovy file-upload

我有这个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>
Run Code Online (Sandbox Code Playgroud)

但是当我尝试通过键入以下内容来查看控制器中的结果时:

render(params);
return true;
Run Code Online (Sandbox Code Playgroud)

我得到了这个结果:

"documentFile":org.springframework.web.multipart.commons.CommonsMultipartFile@14dcf95
Run Code Online (Sandbox Code Playgroud)

如何阅读正在上传的每个文件?我可以得到以下内容吗?

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

ps:我正在使用grails 1.2.2

Rob*_*ska 7

首先,您需要为每个文件输入指定唯一的名称:

<g:uploadForm name="myForm" action="save">
    <input type="file" name="documentFile1" value=""/>
    <input type="file" name="documentFile2" value=""/>
    ...
</g:uploadForm>
Run Code Online (Sandbox Code Playgroud)

然后在您的控制器中,您可以使用:

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

// or iterate through them
request.fileNames.each {
    File file = request.getFile(it)
}
Run Code Online (Sandbox Code Playgroud)

我很确定你的name属性必须是唯一的.我在API中找不到任何可以让您获得使用相同输入上传的文件数组的内容name.

参考文献:


Jus*_*wig 6

从grails 1.2(spring 3.0)开始,您可以使用控制器对象multiplemultiFileMap属性从具有相同名称(或使用HTML5 属性)的输入访问多个文件request(当请求是多部分表单帖子时,request对象将是MultipartRequest的实例).因此,您可以访问特定输入名称(即)的MultipartFile对象列表,documentFile如下所示:

def save = {
    List<MultipartFile> files = request.multiFileMap.documentFile
    int count = files.findAll { !it.empty }.size
    render "uploaded $count files"
}
Run Code Online (Sandbox Code Playgroud)

或者从所有输入访问所有MultipartFile对象,如下所示:

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

编辑2013-02-08:Brian Adams问:

在上面的例子中,我可以从我的网页上的所有输入访问所有MultipartFile对象.但是我希望从任何输入中获取文件都是多个.例如:我输入的名称是:"uploadFiles",我希望从这个输入标签中获取所有文件.你能帮助我吗?

Brian,我想你想要的是上面的第一个版本.如果您的文件输入名为"uploadFiles",则可以使用"uploadFiles"键从multiFileMap访问它:

def save = {
    List<MultipartFile> files = request.multiFileMap.uploadFiles
    int count = files.findAll { !it.empty }.size
    render "uploaded $count files"
}
Run Code Online (Sandbox Code Playgroud)