当尝试使用 Struts 2 上传多个文件时ArrayList
,如何识别每个字段?
例如,如果我有两个文件字段,File1
并且File2
在客户端,我选择仅上传File2
,Struts 2 只会在列表中创建一个元素,我无法正确映射File1
为空和File2
上传的文件。
我可以在这里使用任何标识符吗?
当尝试使用 Struts 2 上传多个文件时ArrayList
,如何识别每个字段?
例如,如果我有两个文件字段,File1
并且File2
在客户端,我选择仅上传File2
,Struts 2 只会在列表中创建一个元素,我无法正确映射File1
为空和File2
上传的文件。
我可以在这里使用任何标识符吗?
用不同的名称命名每个字段,并为操作属性创建相应的访问器。然后他们每个人都会通过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>();
什么更适合您的需求
使用自定义对象的列表(或地图),其中包含您的文件、文件名和内容类型(最终还有其他字段)。一个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 */
}
在行动
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)。