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

时间:2010-09-14 15:12:02

标签: java grails file-upload groovy

我有这个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 个答案:

答案 0 :(得分:6)

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

<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上传的文件数组的内容。

参考文献:

答案 1 :(得分:6)

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

documentFile

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

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

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

  

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

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

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