【问题标题】:Upload multiple files with maintaining Index ( position at which file was uploaded) in Struts2在 Struts2 中上传多个文件并保持索引(上传文件的位置)
【发布时间】:2016-11-14 14:37:40
【问题描述】:

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

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

直到现在在我的Action 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]">

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

----更新----

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

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

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

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

【问题讨论】:

    标签: java jsp file-upload struts2 struts-action


    【解决方案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>
    

    【讨论】:

    • 感谢您的回复,但我不想一次选择文件,我想要逐步选择,请检查更新
    • 我可以做的另一个尝试是,我制作隐藏字段数组,并将其值设置为 01,特别是步骤取决于文件上传与否,在我的操作中检查它的值并处理上传的文件......请建议我
    • 所以就这样做&lt;input type="file" name="upload"&gt;&lt;input type="file" name="upload"&gt;&lt;input type="file" name="upload"&gt;。它像这样工作吗?索引不是被List保留了吗?
    • 我这样做了,但是如果我有 5 &lt;input&gt;,并且我上传了 2 个文件,假设在 &lt;input&gt; 25,我只有上传的文件,即只有 2 个
    • 如果你想区分它们,只需给每个输入一个不同的名称。例如,如果您不想区分它们,那么 1-2 和 2-5 之间应该没有区别。对要区分的输入使用相同的名称和不同的索引是错误的。
    【解决方案2】:

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

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

    我只是发布了我的&lt;tr&gt; 标签的一些示例代码

    我维护了一个 hidden field isFileUpload 初始值为 0 ,很多没有。我的&lt;input type="file"&gt;, 上传文件后,在其 change 事件中,我将 isFileUpload 的值更改为 1 作为

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

    在我的动作类中我有这个代码

    取决于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();
    }
    

    【讨论】:

    • 隐藏字段很好,它们可以使用索引属性名称;)
    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 2014-11-21
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2014-12-31
    相关资源
    最近更新 更多