尝试使用ArrayList
使用Struts2上传多个文件时,如何识别每个字段?
例如,如果我有两个文件字段File1
和File2
,并且在客户端,我选择仅上传File2
,Struts 2只在列表中创建一个元素我无法将File1
空白和File2
与上传的文件正确映射。
我可以在这里使用任何标识符吗?
答案 0 :(得分:0)
为每个字段命名不同的名称,并为操作属性创建相应的访问者。然后每个人都将通过OGNL处理名称并设置相应的属性。尝试使用不同的方法为迭代器标记索引的文件创建列表或映射。
<iterator begin="0" end="50" status="status">
<s:file label="%{File + #status.index}" name="fileUpload[%{#status.index}]" size="40" />
</iterator>
<s:submit value="submit" name="submit" />
行动
private List<File> fileUpload = new ArrayList<File>();
每个属性也应该有访问者
然后通过检查列表索引中的文件,您将知道它们中的哪一个上传了。您也可以尝试使用Map
。
<iterator begin="0" end="50" status="status">
<s:file label="%{File + #status.index}" name="fileUpload['%{#status.index}']" size="40" />
</iterator>
<s:submit value="submit" name="submit" />
行动
private Map<String, File> fileUpload = new HashMap<String, File>();
什么更适合您的需求
答案 1 :(得分:0)
使用自定义对象的列表(或Map),其中包含您的File,fileName和contentType(以及最终的其他字段)。一个JSP 行对应的元素,要清楚。
我确实喜欢这样(因为我还有许多其他领域),它就像一个魅力。
(这是不是唯一的方法,当你需要处理其他字段时,它只是其中一种工作方式会变得更加方便)
POJO
public class MyCustomRow implements Serializable {
private File fileUpload;
private String fileUploadFileName;
private String fileUploadContentType;
private String otherField1;
private String otherField2;
/* All Getters and Setters here */
}
in Action
private List<MyCustomRow> rows;
/* Getter and Setter ... */
JSP中的
<s:iterator value="rows" status="row">
<s:file name="rows[%{#row.index}].fileUpload" />
<s:textfield name="rows[%{#row.index}].otherField1"/>
<s:textfield name="rows[%{#row.index}].otherField2"/>
</s:iterator>
Struts2将自动检测并填充文件名和内容类型(确保堆栈中有FileUploadInterceptor)。