2016-11-14 27 views
1

我有情景,我想上传多个文件,其中用户可能或不可以上传文件,并且我想维护索引在哪个位置用户已经上传的文件,并要保存文件与指数名称上传多个文件与维护索引(在哪个文件被上传的位置)在Struts2

我提到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类

----更新setProperties方法 ----

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

你的每一个ProcessSolutionStep,我想保持,哪个文件上传的具体步骤,

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

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

回答

1

这是我如何解决我的习题LEM:

<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>标签的几个示例代码

我一直保持着一个隐藏字段isFileUpload与inital值,许多没有。我<input type="file">, 上传文件,其变更后的事件中,我改变了isFileUpload价值作为

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

,在我的动作类我有这样的代码

取决于的isFileUpload值即我已经检查了它,

意味着我已经上升的文件在thi S指数位置,并上传的文件映射数组是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(); 
} 
+0

隐藏的领域是好的,他们可以使用索引属性名称;) –

1

无需创建一个新的类(即一个办法,如果你喜欢封装每个对象单独),只要使用List S:

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

感谢您回应,但我并不想一次选择的文件,我想逐步选择,PLZ检查更新 –

+0

还有一试试我可以做的是,我做隐藏字段的数组,并将其值设置为** 0 **或** 1 **,对于特定的**步骤**取决于文件上传与否,检查其值在我的行动和做进程上传的文件,以及... PLZ建议我 –

+0

所以只要做'' '' '输入类型=“文件”名称=“上传”>'。它是这样工作吗?列表是否保留了索引? –