上传多个文件并在 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(这是一种方法,如果您更喜欢单独封装每个对象),只需使用 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>
这就是我解决问题的方法:
<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();
}
我有这样的场景,我想上传多个文件,其中用户可能上传也可能不上传文件,我想在用户上传文件的位置维护索引,并希望将该索引作为名称保存文件
我提到了 ,在我的例子中,我不想创建新的 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(这是一种方法,如果您更喜欢单独封装每个对象),只需使用 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>
这就是我解决问题的方法:
<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();
}