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