1

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

我提到 了https://stackoverflow.com/a/17050230/3425489,在我的情况下我不想创建新类,所以没有提到接受的解决方案

到目前为止,在我的行动课上,我有

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]">

在这种情况下,我无法在我的 Action 类中设置属性

- - 更新 - -

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

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

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

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

4

2 回答 2

1

无需创建新类(这是一种方法,如果您更喜欢单独封装每个对象),只需使用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>
于 2016-11-14T15:33:19.083 回答
1

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

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

我只是发布了我的<tr>标签的一些示例代码

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

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

在我的行动课上,我有这个代码

根据isFileUploadie 的值,我用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();
}
于 2016-11-22T14:02:25.453 回答