【问题标题】:Identifying each field in Multiple File upload识别多文件上传中的每个字段
【发布时间】:2013-06-11 16:45:51
【问题描述】:

当尝试使用ArrayList 使用 Struts 2 上传多个文件时,如何识别每个字段?

例如,如果我有两个文件字段,File1File2,在客户端,我选择只上传 File2,Struts 2 只在列表中创建一个元素,我无法将File1 正确映射为空,File2 与上传的文件正确映射。

我可以在这里使用任何标识符吗?

【问题讨论】:

    标签: java jsp file-upload struts2 multiple-file-upload


    【解决方案1】:

    使用自定义对象的列表(或地图),其中包含您的文件、文件名和内容类型(最终还有其他字段)。一个JSP row 对应的元素,要清楚。

    我确实喜欢那个(因为我也有很多其他领域)而且它就像一个魅力。

    (这不是唯一的方法,它只是其中一种工作方法,当您还需要处理其他字段时会变得更加方便)

    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)。

    【讨论】:

      【解决方案2】:

      为每个字段命名不同的名称,并为操作属性创建相应的访问器。然后他们每个人都会通过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>();
      

      什么更适合您的需求

      【讨论】:

      • 感谢 Roman 的回复,但问题是我正在根据数据库中的值动态创建表单。因此,我可能会生成一个包含 2 个文件字段或 50 个文件字段的表单,但我无法为每个字段定义 getter 和 setter。
      • 地图选项有效,我能够根据地图的密钥进行识别。但是,我无法使用 Map 或使用 List(带键)获取文件名和 contentType,因为它发出如下警告。 “警告:参数 [fileUpload[2]FileName] 与接受的模式模式不匹配!”
      • 我发现这个链接有同样的问题。但那个答案也没有奏效。 [链接]stackoverflow.com/questions/5477877/….我想知道为什么 Struts 2 文档不包含用于上传文件的 Map 选项。
      • @user2475448 您可以尝试组合自定义类中的所有三个字段并将其用作集合的元素。然后需要在名称中进行一些更改以填充索引属性。
      • @RomanC ,我也想实现相同的功能,但无法在我的操作中映射,请 guide 我同样。我有File [] 没有 List,并且我不想错过上传文件的索引
      猜你喜欢
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多