{font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face {font-family:""@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ @page {} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} -->
< html >
< head >
< title > 上传任意多个文件(总大小不能超过2M) </ title >
< script language ="javascript" >
// 在DOM中插入一个上传文件列表项(div元素)和一个元素
function insertNextFile(obj)
{
// 获取上传控制个数
var childnum = document.getElementById( " files " ).getElementsByTagName( " input " ).length;
var id = childnum - 1 ;
var fullName = obj.value;
// 插入
【第 3 步】 建立Struts 动作类(Action 的子类)
在这一步来配置一下在第2步和第3步分别建立的ActionForm和Action的子类。打开struts-config.xml文件,在元素中加入如下的子元素:
【第1步】建立上传文件的JSP页面
要想实现上述的功能,需要在JavaScript中使用DOM技术(关于JavaScript和DOM技术的相关内容已经超出本文讨论的范围,如果读者想了解JavaScript和DOM技术的细节部分,请参阅其他相关技术资料)。
在目录中建立一个uploadMoreFile.jsp文件,代码如下:
< html >
< head >
< title > 上传任意多个文件(总大小不能超过2M) </ title >
< script language ="javascript" >
// 在DOM中插入一个上传文件列表项(div元素)和一个元素
function insertNextFile(obj)
{
// 获取上传控制个数
var childnum = document.getElementById( " files " ).getElementsByTagName( " input " ).length;
var id = childnum - 1 ;
var fullName = obj.value;
// 插入
元素及其子元素
var fileHtml = '';
fileHtml += ' < div id = " file_preview' + id + ' " style = " border-bottom: 1px solid #CCC; " > ';
fileHtml += ' < img width = 30 height = 30 src = " images/file.gif " title = " ' + fullName + ' " /> ';
fileHtml += ' < a href = " javascript:; " onclick = " removeFile(' + id + '); " > 删除 </ a > & nbsp; & nbsp;';
fileHtml += fullName.substr(fullName.lastIndexOf('//') + 1 ) + ' </ div > ';
var fileElement = document.getElementById( " files_preview " );
fileElement.innerHTML = fileElement.innerHTML + fileHtml;
obj.style.display = 'none'; // 隐藏当前的元素
addUploadFile(childnum); // 插入新的元素
}
// 插入新的元素,适合于不同的浏览器(包括IE、FireFox等)
function addUploadFile(index)
{
try // 用于IE浏览器
{
var uploadHTML = document.createElement( " " + index +
"' name='file[" + index + "]' onchange='insertNextFile(this)'/>");
document.getElementById("files").appendChild(uploadHTML);
}
catch(e) // 用于其他浏览器
{
var uploadObj = document.createElement("input");
uploadObj.setAttribute("name", "file[" + index + "]");
uploadObj.setAttribute("onchange", "insertNextFile(this)");
uploadObj.setAttribute("type", "file");
uploadObj.setAttribute("id", "file_" + index);
document.getElementById("files").appendChild(uploadObj);
}
}
function removeFile(index) // 删除当前文件的
var fileHtml = '';
fileHtml += ' < div id = " file_preview' + id + ' " style = " border-bottom: 1px solid #CCC; " > ';
fileHtml += ' < img width = 30 height = 30 src = " images/file.gif " title = " ' + fullName + ' " /> ';
fileHtml += ' < a href = " javascript:; " onclick = " removeFile(' + id + '); " > 删除 </ a > & nbsp; & nbsp;';
fileHtml += fullName.substr(fullName.lastIndexOf('//') + 1 ) + ' </ div > ';
var fileElement = document.getElementById( " files_preview " );
fileElement.innerHTML = fileElement.innerHTML + fileHtml;
obj.style.display = 'none'; // 隐藏当前的元素
addUploadFile(childnum); // 插入新的元素
}
// 插入新的元素,适合于不同的浏览器(包括IE、FireFox等)
function addUploadFile(index)
{
try // 用于IE浏览器
{
var uploadHTML = document.createElement( " " + index +
"' name='file[" + index + "]' onchange='insertNextFile(this)'/>");
document.getElementById("files").appendChild(uploadHTML);
}
catch(e) // 用于其他浏览器
{
var uploadObj = document.createElement("input");
uploadObj.setAttribute("name", "file[" + index + "]");
uploadObj.setAttribute("onchange", "insertNextFile(this)");
uploadObj.setAttribute("type", "file");
uploadObj.setAttribute("id", "file_" + index);
document.getElementById("files").appendChild(uploadObj);
}
}
function removeFile(index) // 删除当前文件的
和元素
{
document.getElementById( " files_preview " ).removeChild(document.getElementById( " file_preview " + index));
document.getElementById( " files " ).removeChild(document.getElementById( " file_ " + index));
}
function showStatus(obj) // 显示“正在上传文件
”提示信息
{
document.getElementById( " status " ).style.visibility = " visible " ;
}
</ script >
</ head >
< body >
< html:form enctype ="multipart/form-data" action ="uploadMoreFile" >
< span id ="files" >
< input type ="file" id ="file_0" name ="file[0]" onchange ="insertNextFile(this)" />
</ span >
< html:submit value =" 上传 " onclick ="showStatus(this);" />
</ html:form > < p >
< div id ="status" style ="visibility:hidden;color:Red" > 正在上传文件
</
div
>
<
p
>
< div id ="files_preview" style ="width:500px;height:500px; overflow :auto" ></ div >
</ body >
</ html >
{
document.getElementById( " files_preview " ).removeChild(document.getElementById( " file_preview " + index));
document.getElementById( " files " ).removeChild(document.getElementById( " file_ " + index));
}
function showStatus(obj) // 显示“正在上传文件
”提示信息
{
document.getElementById( " status " ).style.visibility = " visible " ;
}
</ script >
</ head >
< body >
< html:form enctype ="multipart/form-data" action ="uploadMoreFile" >
< span id ="files" >
< input type ="file" id ="file_0" name ="file[0]" onchange ="insertNextFile(this)" />
</ span >
< html:submit value =" 上传 " onclick ="showStatus(this);" />
</ html:form > < p >
< div id ="status" style ="visibility:hidden;color:Red" > 正在上传文件
</
div
>
<
p
>
< div id ="files_preview" style ="width:500px;height:500px; overflow :auto" ></ div >
</ body >
</ html >
在uploadMoreFile.jsp文件中使用了JavaScript和DOM技术来控制新加入的上传文件以及删除不需要的上传文件。并且在加入元素时考虑了不同的浏览器的差异(详见addUploadFile)。
【第2步】建立ActionForm的子类
在工程目录>/src/actionform目录中建立一个UploadMoreForm.java文件,代码如下:
package
actionform;
import org.apache.struts.action. * ;
import org.apache.struts.upload.FormFile;
import java.util. * ;
public class UploadMoreForm extends ActionForm
{
private List < FormFile > myFiles = new ArrayList < FormFile > (); // 用于保存不定数量的FormFile对象
public FormFile getFile( int i) // 索引属性
{
return myFiles.get(i);
}
public void setFile( int i, FormFile myFile) // 索引属性
{
if (myFile.getFileSize() > 0 ) // 只有上传文件的字节数大于0,才上传这个文件
{
myFiles.add(myFile);
}
}
public int getFileCount() // 获得上传文件的个数
{
return myFiles.size();
}
}
import org.apache.struts.action. * ;
import org.apache.struts.upload.FormFile;
import java.util. * ;
public class UploadMoreForm extends ActionForm
{
private List < FormFile > myFiles = new ArrayList < FormFile > (); // 用于保存不定数量的FormFile对象
public FormFile getFile( int i) // 索引属性
{
return myFiles.get(i);
}
public void setFile( int i, FormFile myFile) // 索引属性
{
if (myFile.getFileSize() > 0 ) // 只有上传文件的字节数大于0,才上传这个文件
{
myFiles.add(myFile);
}
}
public int getFileCount() // 获得上传文件的个数
{
return myFiles.size();
}
}
在UploadMoreFile 类中使用了List 对象来保存不定数量的FormFile 对象。读者也可以使用其他的集合类来保存这些FormFile 对象。而且在UploadMoreFile 类中使用了带索引的属性,详见getFile 和setFile 方法。在这两个方法中,第一个参数是一个int 类型的变量。要注意的是,索引属性的get 和set 方法的第一个参数必须是int 类型的变量,否则系统会不认这个索引属性。这个索引属性用于和客户端不定数量的 元素相对应,每一个索引项代表一个 元素上传的文件(FormFile 对象)。
【第 3 步】 建立Struts 动作类(Action 的子类)
由于在《Struts1.x系列教程(8):上传单个文件》一文的例子中的UploadAction类中已经有了一个saveFile方法用于保存单个上传文件,因此,处理多个上传文件的Struts动作类可以从UploadAction类继承。在工程目录>/src/action目录中建立一个UploadMoreAction.java文件,代码如下:
package
action;
import javax.servlet.http. * ;
import org.apache.struts.action. * ;
import org.apache.struts.upload.FormFile;
import java.io. * ;
import actionform. * ;
public class UploadMoreAction extends UploadAction
{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
UploadMoreForm umForm = (UploadMoreForm) form;
PrintWriter out = null ;
int count = 0 ;
try
{
response.setCharacterEncoding( " GBK " );
out = response.getWriter();
count = umForm.getFileCount(); // 获得上传文件的总数
for ( int i = 0 ; i < count; i ++ )
{
saveFile(umForm.getFile(i)); // 开始保存每一个上传文件
}
out.println( " 成功上传 " + String.valueOf(count) + " 个文件. " );
}
catch (Exception e)
{
out.println(e.getMessage());
}
return null ;
}
}
import javax.servlet.http. * ;
import org.apache.struts.action. * ;
import org.apache.struts.upload.FormFile;
import java.io. * ;
import actionform. * ;
public class UploadMoreAction extends UploadAction
{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
UploadMoreForm umForm = (UploadMoreForm) form;
PrintWriter out = null ;
int count = 0 ;
try
{
response.setCharacterEncoding( " GBK " );
out = response.getWriter();
count = umForm.getFileCount(); // 获得上传文件的总数
for ( int i = 0 ; i < count; i ++ )
{
saveFile(umForm.getFile(i)); // 开始保存每一个上传文件
}
out.println( " 成功上传 " + String.valueOf(count) + " 个文件. " );
}
catch (Exception e)
{
out.println(e.getMessage());
}
return null ;
}
}
【第 4 步】 配置struts-config.xml
在这一步来配置一下在第2步和第3步分别建立的ActionForm和Action的子类。打开struts-config.xml文件,在元素中加入如下的子元素:
<
form-bean
name
="uploadMoreForm"
type
="actionform.UploadMoreForm"
/>
在元素中加入如下的子元素:
<
action
name
="uploadMoreForm"
path
="/uploadMoreFile"
scope
="request"
type
="action.UploadMoreAction"
/>
【第 5 步】 复制gif 图片
本例中使用了一个gif图,在Web根目录中建立一个images目录,并复制一个file.gif文件(30*30)到这个目录(读者可以使用自己喜欢的任何gif图片)。
由于在