【问题标题】:How to iterate over uploaded files in Grails如何在 Grails 中迭代上传的文件
【发布时间】:2010-09-14 15:12:02
【问题描述】:

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

【问题讨论】:

  • 您的表单中的文件数量是否可变,或者总是四个?如果它是可变的,我会相应地更新我的答案。
  • 它是可变的。我确实在名称的末尾添加了数字……但它仍然很奇怪,因为当您多次键入 时,它会在参数中生成“某物”数组。
  • 是的,我正在查看 Grails API,但找不到基于文件输入检索 File[] 对象的方法。 Servlet API 提供了获取 String[] 数组的方法,但我还没有查看它的源代码以了解它是如何做到的。据推测,它可以通过对 HTTP 请求的一些手动工作来完成,但这可能是太多的工作。使用 Grails 的 request.fileNames 可能是一个合理的等价物。

标签: java grails file-upload groovy


【解决方案1】:

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

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

参考资料:

【讨论】:

  • 一年后,这个解决方案仍然有用。谢谢罗!
  • 所以我不能使用&lt;input type="file" name="files[]" multiple /&gt;
  • 我不这么认为。我的意思是,你可以,但它不会像 PHP 一样工作。您仍然可以迭代 fileNames 以完成基本相同的事情。
【解决方案2】:

从 grails 1.2 (spring 3.0) 开始,您可以使用控制器的 request 对象的 multiFileMap 属性从具有相同名称(或使用 HTML5 multiple 属性)的输入访问多个文件(当request 是一个多部分的表单帖子,request 对象将是MultipartRequest 的一个实例)。因此,您可以像这样访问特定输入名称(即documentFile)的MultipartFile 对象列表:

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: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"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多