上传多个文件并在 Struts2 中维护索引(上传文件的位置)

Upload multiple files with maintaining Index ( position at which file was uploaded) in Struts2

我有这样的场景,我想上传多个文件,其中用户可能上传也可能不上传文件,我想在用户上传文件的位置维护索引,并希望将该索引作为名称保存文件

我提到了 ,在我的例子中,我不想创建新的 class,所以没有提到接受的解决方案

到现在在我的行动中Class我有

File upload [];
String uploadContentType []
String uploadFileName []

getter 和 setter

在我的 jsp 我试过

<input type="file" name="upload">

但我只能获取上传的文件,无法维护索引

也试过

<input type="file" name="upload[0]">
<input type="file" name="upload[1]">
<input type="file" name="upload[2]">

对于这种情况,我无法在我的操作中设置属性 class

----已更新----

可以参考我的型号Struts 2 : Unable to access Model properties in JSP

对于你的每个 ProcessSolutionStep,我想维护,为特定步骤上传哪个文件,

即用户可以为第 1 步第 5 步 上传文件,跳过中间步骤并在视图中。

我想显示为特定步骤上传的文件

无需创建新的 class(这是一种方法,如果您更喜欢单独封装每个对象),只需使用 Lists:

public class Upload extends ActionSupport{

    private List<File> files;
    private List<String> filesContentType;
    private List<String> filesFileName;

    /* GETTERS AND SETTERS */           

    public String execute() throws Exception{
        System.out.print("\n\n---------------------------------------");
        int i=0;
        for (File file : files){
            System.out.print("\nFile ["+i+"] ");
            System.out.print("; name:"         + filesFileName.get(i));
            System.out.print("; contentType: " + filesContentType.get(i));
            System.out.print("; length: "      + file.length());
            i++;
        }
        System.out.println("\n---------------------------------------\n");
        return SUCCESS;
    }

}

使用multiple属性,别忘了正确的enctype:

<s:form action="upload" enctype="multipart/form-data" >
    <s:file name="files" multiple="multiple" />
    <s:submit value="Upload files" />
</s:form>

这就是我解决问题的方法:

    <tr>
    <td> Step 1 :
    <td>
        <input type="hidden" name="isFileUpload" id="id-is-file-upload-0" value="0">
        <textarea id="id-solution-0" name="processSolutionSteps" rows="2" cols="50" maxlength="200" class="class-text-area class-text-area-not-blank"></textarea>
        <!-- <input type="text" id="id-solution-0" name="processSolution" maxlength="30" size="35"> -->
        <p id="id-process-solution-counter-0"></p>
    </td>
    <td>
        <input type="file" id="id-file-0" name="uploads">
    </td>
</tr>
<tr>
    <td> Step 2 :
    <td>
        <input type="hidden" name="isFileUpload" id="id-is-file-upload-1" value="0">
        <textarea id="id-solution-1" name="processSolutionSteps" rows="2" cols="50" maxlength="200" class="class-text-area class-text-area-not-blank"></textarea>
        <!-- <input type="text" id="id-solution-1" name="processSolution" size="35"> -->
        <p id="id-process-solution-counter-1"></p>
    </td>
    <td>
        <input type="file" id="id-file-1" name="uploads">
    </td>
</tr>
<tr>
    <td> Step 3 :
    <td>
        <input type="hidden" name="isFileUpload" id="id-is-file-upload-2" value="0">
        <textarea id="id-solution-2" name="processSolutionSteps" rows="2" cols="50" maxlength="200" class="class-text-area class-text-area-not-blank"></textarea>
        <!-- <input type="text" id="id-solution-2" name="processSolution" size="35"> -->
        <p id="id-process-solution-counter-2"></p>
    </td>
    <td>
        <input type="file" id="id-file-2" name="uploads">
    </td>
</tr>

我只是 post 我的 <tr> 标签的一些示例代码

我维护了一个隐藏字段 isFileUpload,初始值为0,因为没有。我的 <input type="file">, 上传文件后,在其 change 事件中,我将 isFileUpload 的值更改为 1 as

$('#id-solution-table').on('change', 'input[type=file]', function () {
    $('#id-is-file-upload-'+$(this).prop("id").split("-")[2]).val(1);
});

在我的操作中 Class 我有这个代码

取决于 isFileUpload 的值,即我已经用 1

检查过

意味着我已经在这个索引位置 上传了文件 并映射了上传的文件数组 uploads

private File [] uploads;
private String [] uploadsFileName;
private String [] uploadsContentType;
private short isFileUpload [];

try {
    int fileIndex = 0;
    for (int i = 0; i < this.isFileUpload.length; i++) {
        if( this.isFileUpload[i] == 1 ) {
            System.out.println(" index    "+i+ " isFileUpload "+this.isFileUpload[i]);
            System.out.println("Index       "+i+ "     "+this.uploadsFileName[ fileIndex ]);
            String filePath = path;
            new File(filePath).mkdirs();
            FileUtils.copyFile(this.uploads[ fileIndex ], new File(filePath+"/"+i+"."+FilenameUtils.getExtension(this.uploadsFileName[ fileIndex ])));
            ++fileIndex;
        }
    }
} catch(Exception exception) {
    addActionError("Some files not uploaded.");
    exception.printStackTrace();
}