2016-11-14 34 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

所以只要做'' '' '輸入類型=「文件」名稱=「上傳」>'。它是這樣工作嗎?列表是否保留了索引? –