
实现这个Web程序的基本步骤和《Struts1.x系列教程(8):上传单个文件》一文中所给出的例子类似,我们可按下面五步来实现这个Web程序: 【第1步】建立上传文件的JSP页面
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
在uploadMoreFile.jsp文件中使用了JavaScript和DOM技术来控制新加入的上传文件以及删除不需要的上传文件。并且在加入元素时考虑了不同的浏览器的差异(详见addUploadFile)。
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
由于在《Struts1.x系列教程(8):上传单个文件》一文的例子中的UploadAction类中已经有了一个saveFile方法用于保存单个上传文件,因此,处理多个上传文件的Struts动作类可以从UploadAction类继承。在
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
在
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
【第5步】复制gif图片 本例中使用了一个gif图,在Web根目录中建立一个images目录,并复制一个file.gif文件(30*30)到这个目录(读者可以使用自己喜欢的任何gif图片)。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12921506/viewspace-548640/
,如需转载,请注明出处,否则将追究法律责任。
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
要想实现上述的功能,需要在JavaScript中使用DOM技术(关于JavaScript和DOM技术的相关内容已经超出本文讨论的范围,如果读者想了解JavaScript和DOM技术的细节部分,请参阅其他相关技术资料)。
在
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> <%@ page pageEncoding="GBK"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<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> ';
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元素 --%>
<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>
<%-- 在此处用DOM技术插入上传文件列表项 --%>
<div id="files_preview" style ="width:500px;height:500px; overflow :auto" >div>
body>
html>
【第2步】建立ActionForm的子类
在
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> 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();
}
}
【第3步】建立Struts动作类(Action的子类)
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> 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;
}
}
在这一步来配置一下在第2步和第3步分别建立的ActionForm和Action的子类。打开struts-config.xml文件,在
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><form-bean name="uploadMoreForm" type="actionform.UploadMoreForm" />
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> <action name="uploadMoreForm" path="/uploadMoreFile" scope="request" type="action.UploadMoreAction" />
由于在《Struts1.x系列教程(8):上传单个文件》一文的例子中已经设置了上传文件的保存路径和上传文件的大小限制,因此,在本例中仍然使用这一设置。但要注意的是,在上传多个文件时,最大上传文件尺寸指的是所有上传文件的尺寸之和,而不是指每个文件的尺寸。
http://localhost:8080/samples/uploadMoreFile.jsp