對于實現文件上傳功能來說,Commons-fileupload組件是一個不錯的選擇,本文使用它實現了單個文件及多個文件上傳,這里將實現過程寫出來與大家共享。
1.單個文件上傳。
頁面代碼:
....<div id="content">
<fieldset><legend>下載列表</legend>
<ul>
<%
List<String> downloadList=(List<String>)request.getAttribute("downloadList");
if(downloadList!=null){
for(String str:downloadList){
out.print("<li><a href='DownloadFile?file="+str+"'>"+str+"</a></li>");
}
}
%>
</ul>
</fieldset>
<!-- enctype屬性為表單定義了MIME編碼方式,上傳文件的表單enctype屬性必須如此設置 -->
<form method="post" action="UploadFile" enctype="multipart/form-data" >
<p><input type="text" name="fileIntro" value="" />文件介紹</p>
<p><input type="file" name="myfile1" value="瀏覽文件" /></p>
<p><input type="submit" value="上傳"/></p>
</form>
</div>....
在上傳表單中,既有普通文本域也有文件上傳域,注意在Servlet中取它們和平常的做法不同:
Servlet代碼:
package com.sitinspring.action;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.sitinspring.util.UploadUtil;
/**
* 用于文件上傳處理的Servlet
* @author sitinspring
*
* @date 2008-2-12
*/
public class UploadFileServlet extends HttpServlet {
private static final long serialVersionUID = 56890894234786L;
@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
request.setCharacterEncoding("UTF-8");
// 文件上傳部分
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart == true) {
try {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// 得到所有的表單域,它們目前都被當作FileItem
List<FileItem> fileItems = upload.parseRequest(request);
Iterator<FileItem> iter = fileItems.iterator();
// 依次處理每個表單域
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if(item.isFormField()){
// 如果item是正常的表單域
String name = item.getFieldName();
String value = item.getString();
System.out.print("表單域名為:"+name+"表單域值為:"+value);
}
else{
// 如果item是文件上傳表單域
// 獲得文件名及路徑
String fileName = item.getName();
if (fileName != null) {
File fullFile = new File(item.getName());
// 如果文件存在則上傳
if(fullFile.exists()){
File fileOnServer = new File(UploadUtil.getUploadPath(),
fullFile.getName());
item.write(fileOnServer);
System.out.println("文件"+fileOnServer.getName()+"上傳成功");
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("the enctype must be multipart/form-data");
}
// 取得服務器中已有文件的下載列表
List<String> fileListInServer=new ArrayList<String>();
File dir = new File(UploadUtil.getUploadPath());
String[] children = dir.list();
if (children != null) {
for (int i=0; i<children.length; i++) {
fileListInServer.add(children[i]);
}
}
request.setAttribute("downloadList", fileListInServer);
// 跳回原頁面
RequestDispatcher dispatcher = request
.getRequestDispatcher("/web/page/uploadtoserver.jsp");
dispatcher.forward(request, response);
return;
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
doPost(request, response);
}
}
從上面的代碼可以看出,無論是否文件上傳表單域都被當成了FileItem來處理,要區別開來使用isFormField()方法即可,返回真是常規表單域,返回假則是文件上傳表單域。
2.多個文件上傳到服務器端。
這里采用JS動態生成幾個文件上傳表單域即可,Servlet無需改變。
多文件上傳頁面代碼如下:
<%@ page contentType="text/html; charset=UTF-8"%>
<%@page language="java" import="java.util.List"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>上傳多個文件到服務器</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" rev="stylesheet" href="web/css/style.css"
type="text/css" />
</head>
<body>
<div id="bodyDiv">
<div id="header">
<jsp:include page="/web/page/branch/header.jsp"/>
</div>
<div id="sidebar">
<jsp:include page="/web/page/branch/sidebar.jsp"/>
</div>
<div id="content">
<fieldset><legend>下載列表</legend>
<ul>
<%
List<String> downloadList=(List<String>)request.getAttribute("downloadList");
if(downloadList!=null){
for(String str:downloadList){
out.print("<li><a href='DownloadFile?file="+str+"'>"+str+"</a></li>");
}
}
%>
</ul>
</fieldset>
<!-- enctype屬性為表單定義了MIME編碼方式,上傳文件的表單enctype屬性必須如此設置 -->
<form name="uploadForm" method="post" action="UploadFile" enctype="multipart/form-data" >
<p><input type="button" value="增加上傳按鈕" onclick="addUploadButton()"/></p>
<p><input type="file" name="myfile1" value="瀏覽文件" /></p>
<p><input type="submit" value="上傳"/></p>
</form>
</div>
<div id="footer">
<jsp:include page="/web/page/branch/footer.jsp"/>
</div>
</div>
</body>
JS代碼:
<script LANGUAGE="JavaScript">
<!--
var count=1;
function addUploadButton(){
// 按ID找到FOrm
var uploadForm=document.getElementById("uploadForm");
// 創建P元素
var pNode=document.createElement("p");
// 累加Count以觀察次數
count=count+1;
pNode.innerHTML="<input type='file' name='myfile"+count+"' value='瀏覽文件'/>";
// 將P元素添加到body中
uploadForm.appendChild(pNode);
}
//-->
</script>
</html>
實例代碼:
http://m.tkk7.com/Files/sitinspring/FileUpload20080412145412.rar