1. 经过定义Action属性,接收文件html
html: <input type="file" name="file1">数组
action定义与input name相同的属性服务器
private File file1;
private String file1FileName;
private String file1ContentType;app
表单提交后,Action会自动给属性赋值,FileName,ContentType能够不定义,可是File file1必须定义;编码
多文件上传:orm
html: 须要定义多个name相同的inputhtm
<input type="file" name="file1">对象
<input type="file" name="file1">ip
action :文件接收对象定义为Listget
private List<File> file1;
private List<String> file1FileName;
private List<String> file1ContentType;
表单提交后能够文件集合对象:
file1:
[\temp\upload_d312fc99_d4d5_4eec_a90a_666476e67579_00000031.tmp, \temp\upload_d312fc99_d4d5_4eec_a90a_666476e67579_00000032.tmp]
file1FileName:[1.jpg, 2.png]
file1ContentType : [image/jpeg, image/png]
经过文件集合的index获取对应的文件对象;
2. 经过Map接收文件对象
有时咱们并不但愿在action中定义太多的属性对象来接收form数据,由于那样看起来很不爽,或者若是咱们上传多个文件,每一个文件input的name都不同,那么咱们是否是就在action中定义不少个File 属性接收文件,很显然这样是不可取;
经过在action定义一个Map 属性变量,不只能够接收多文件,并且能够接收页面动态产生的input file 对象;
如:
html :
<input type="file" name="fileMap.file1"><br/><br/>
<input type="file" name="fileMap.file1"><br/><br/>
<input type="file" name="fileMap.file2"><br/><br/>
action :
private Map<String,Object> fileMap;
表单提交后 fileMap接收到form数据以下:
{
file2FileName : [3.png]
file2ContentType : [image/png]
file2 : [\temp\upload_6dc13bae_7ae0_4f3b_98a4_1ce228a26405_00000016.tmp]
file1FileName : [1.jpg,2.png]
file1ContentType : [image/jpeg,image/png]
file1 : [
\temp\upload_6dc13bae_7ae0_4f3b_98a4_1ce228a26405_00000014.tmp
,\temp\upload_6dc13bae_7ae0_4f3b_98a4_1ce228a26405_00000015.tmp
]
}
.tmp是服务器临时文件,map里面的value值都是以数组形式存储,表单名称成相同的文件会放到同一数组中,这样不管多文件仍是单文件均可以完成同一接收;
3. 经过Request包装类获取文件
Struts2请求包装类StrutsRequestWrapper,MultiPartRequestWrapper
当form enctype="multipart/form-data"时,HttpServletRequest实现类为MultiPartRequestWrapper;
普通表单提交时,HttpServletRequest实现类为StrutsRequestWrapper;
示例:
html :
<input type="file" name="file1"><br/><br/>
<input type="file" name="file1"><br/><br/>
<input type="file" name="file2"><br/><br/>
action 处理以下:
//获取request对象
HttpServletRequest request=ServletActionContext.getRequest();
//判断request实现类
if(request instanceof MultiPartRequestWrapper){
try {
MultiPartRequestWrapper multiRequest=(MultiPartRequestWrapper) request;
String[] fileNames=multiRequest.getFileNames(fieldName);
String[] contentTypes=multiRequest.getContentTypes(fieldName);
File[] files=multiRequest.getFiles(fieldName);
} catch (Exception e) {
// TODO: handle exception
}
}
fieldName为表单name值;
当fieldName="file1" , 获取file1文件:
String[] fileNames=[1.jpg,2.png];
String[] contentTypes = [image/jpeg,image/png];
File[] files = [
\temp\upload_6dc13bae_7ae0_4f3b_98a4_1ce228a26405_00000014.tmp
,\temp\upload_6dc13bae_7ae0_4f3b_98a4_1ce228a26405_00000015.tmp
]
当fieldName="file2" , 获取file2文件:
String[] fileNames = [3.png];
String[] contentTypes = [image/png];
File[] files= [\temp\upload_6dc13bae_7ae0_4f3b_98a4_1ce228a26405_00000016.tmp];
方法2 与 方法3 都能实现动态接收任意文件,而相比之下,方法2看着有些别扭,并不符合常规编码习惯,应该不多有程序猿使用map接收数据;而方法3则相比较灵活;