聲明: 上傳核心代碼采用cos 此版本屬于自己改裝。版權歸
天星網 近兩天項目需要改版上傳組件,我仔細研究了一下各上傳組件的源碼。cos不論從速度還是文件大小方面保持著良好的特性。
經過我改裝后的cos可以限制上傳文件類型,返回文件流報告(ajax使用),假設讀者已經熟悉cos和ajax。可以返回上傳文件名稱,完成百分比,文件傳輸速度,需要總時間,剩余時間。
以下是部分代碼:
文件1
<%
//創建此目錄保存文件
String saveDirectory = "testfile";
//每個文件最大100m,最多3個文件,所以...
int maxPostSize = 3 * 100 * 1024 * 1024;
//命名規則
FileRenamePolicy policy = new DateFileRenamePolicy();
HttpFileUPload fileUpload = new HttpFileUPload();
//編碼
fileUpload.setEncoding("UTF-8");
fileUpload.setMaxPostSize(maxPostSize);
fileUpload.setPolicy(policy);
fileUpload.setSaveDirectory(saveDirectory);
//允許上傳文件類型
fileUpload.setAllowFiles("jpg,gif,mp3,rmvb,wmv,ghs,reg");
//輸出反饋信息
try{
Enumeration files = fileUpload.parseRequest(request);
while (files.hasMoreElements()) {
String name = (String) files.nextElement();
File file = fileUpload.getFile(name);
if (file != null) {
out.println("上傳的文件:" + file.getAbsolutePath()+" ");
out.println("<hr>");
}
}
}catch(Exception e){
out.println(e.toString()+"<br>");
out.println("<input type='button' value='重新上傳' onClick=\""+"location='index.jsp'\""+">");
}finally{
//清理session
Thread.sleep(1000);
fileUpload.dispose();
}
%>
文件2
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>文件上傳</title>
</head>
<body>
<form name="uploadForm" id="uploadForm" method="post" enctype="multipart/form-data" action="upload.jsp">
<P>
<INPUT name="file1" type="file">
</P>
<P align="left">
<INPUT name="file2" type="file">
</P>
<p>
<INPUT name="file3" type="file">
</p>
<p>
</p>
<p id="show">
</p>
<p align="left">
<input type="button" name="Submit" id="upload" value="上傳" onClick="go();">
</p>
</form>
</body>
</html>
<script type="text/javascript">
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} else {
if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
} else {
}
}
}
function go() {
document.uploadForm.submit();
createXMLHttpRequest();
var url = "ProgressBarServlet";
var button = document.getElementById("upload");
button.disabled = true;
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = goCallback;
xmlHttp.send(null);
}
function goCallback() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
setTimeout("pollServer()", 2000);
}
}
}
function pollServer() {
createXMLHttpRequest();
var url = "ProgressBarServlet";
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = pollCallback;
xmlHttp.send(null);
}
function pollCallback() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
var completePercent = xmlHttp.responseXML.getElementsByTagName("completePercent")[0].firstChild.data;
//百分比
var uploadSpeedKB = xmlHttp.responseXML.getElementsByTagName("uploadSpeedKB")[0].firstChild.data;
//傳輸速度
var remainTimeHMS = xmlHttp.responseXML.getElementsByTagName("remainTimeHMS")[0].firstChild.data;
//剩余時間
var totalTimeHMS = xmlHttp.responseXML.getElementsByTagName("totalTimeHMS")[0].firstChild.data;
//總時間
var fileName = xmlHttp.responseXML.getElementsByTagName("fileName")[0].firstChild.data;
if (completePercent < 100) {
document.getElementById("show").innerHTML =
fileName + "\uff1b" + completePercent
+ "% <br>\u901f\u5ea6\uff1a" + uploadSpeedKB +"KB"
+ "\uff1b<br>\u5269\u4f59\u65f6\u95f4" + remainTimeHMS
+ "\uff1b<br>\u9700\u8981\uff1a" + totalTimeHMS;
setTimeout("pollServer()", 1000);
} else {
document.getElementById("show").innerHTML = "\u5b8c\u6210";
}
}
}
}
</script>
cos的優越性得意于他對IO流的重寫。BufferedServletInputStream,LimitedServletInputStream,PartInputStream 經過幾次對原始流的優化。詳細信息請查看cos源碼。
周行制作
jwebee@163.com 工程文件下載jwebee
我的個人網站
posted on 2006-11-15 09:59
周行 閱讀(921)
評論(0) 編輯 收藏 所屬分類:
IT技術