一。默认的做法
struts2对文件upload做了默认封装,用起来比较爽。
我在一个项目中用下面这几行代码就实现了多文件的上传:
<form action="xx.action" method="post" enctype="multipart/form-data">
第一个文件:<input type="file" name="upload" /><br>
第二个文件:<input type="file" name="upload" /><br>
第三个文件:<input type="file" name="upload" /><br>
<input value="上传" type="submit" />
</form>
Action中只需要定义下面这几行就能获取到上传的文件列表。
public class xxAction extends ActionSupport
{
private File[] upload;
private String[] uploadContentType;
private String[] uploadFileName;
//getter&setter
}
下面判断一下upload,做了如下实现。。。就犯了一个隐晦的bug:
if (upload != null) {
if (upload[1] != null) { //户主照片
doA
}
if (upload.length>2 && upload[2] != null) { //新房照片
doB
}
if (upload.length>3 && upload[3] != null) { //新房照片
doC
}
}
用户按序传完整3张图片还好,如果只传第2个文件呢??那么取到的只有upload[1],会执行doA而不是理论上的doB.
二。改良的逻辑
其实对多文件的上传,考虑下面这种实现方式可能会更好: <s:file>标签
添加户主图片:<s:file name="upload1" />
添加原房图片:<s:file name="upload2" />
添加新房图片:<s:file name="upload3" />
在Action里面定义:
public class xxxAction extends ActionSupport {
// file upload
private File upload1; // 客户端文件域
private String upload1ContentType; // 上传的文件类型
private String upload1FileName; // 上传的文件名
private File upload2; // 客户端文件域
private String upload2ContentType; // 上传的文件类型
private String upload2FileName; // 上传的文件名
private File upload3; // 客户端文件域
private String upload3ContentType; // 上传的文件类型
private String upload3FileName; // 上传的文件名
//getter &&setter
}
将多文件分开处理,struts2根据<s:file>标签一样可以自动封装到file信息