************本人水平有限,在学习时请用批判的态度学习,有问题给我留言************
说详解有点没有底气了,这是讲文件上传时的一个例子,我把每一行代码的注释都写了出来,加强理解,熟悉api。
我把上传文件功能放到了一个工程里,前台有一个index.jsp页面,一个success.jsp页面
一个js目录、一个css文件
需要apache commons-fileupload包
commons-io包
前台还有个js的小例子,模拟软键盘,例子不是原创,只是为了美化前台。
工程下载地址:http://download.youkuaiyun.com/source/1458143
废话不多说了,上代码!!
下面的是核心的servlet
package cn.itcast.upload;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* 文件上传 servlet
* 详尽注释每一步做法和含义,方便大家学习
*
* @version 1.0
* @author caohua
* @company 传智博客
*/
public class FileUploadServlet extends HttpServlet {
/**
* 序列化servlet,防止钝化后无法恢复的问题
*/
private static final long serialVersionUID = 1L;
public FileUploadServlet() {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=gb2312");//设置返回头信息
PrintWriter out = response.getWriter();//返回的输出
String path = getServletContext().getRealPath("/upload");//得到该应用下的upload目录在服务器上的绝对路径
if( path == null ){//如果为空表示不能访问,可能是系统设置了访问权限
out.print("无法访问该目录!");
return;
}
File uploadDir = new File(path);//得到该目录的文件对象
if(!uploadDir.exists()){//判断该目录是否存在
if(!uploadDir.mkdir()){//如果不存在就建立该目录
out.print("无法创建该目录!");//如果建立失败,给出提示
return;
}
}
if(!ServletFileUpload.isMultipartContent(request)){//用 ServletFileUpload 类的静态方法 isMultipartContent 判断 request 是否是 multipart/form-data 类型
out.print("只能 multipart/form-data 类型数据");
return;
}
//创建 DiskFileItemFactory 对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//factory.setRepository(tempDir);可以设置缓存目录
factory.setSizeThreshold(1024 * 1024);//超过1m的数据采用临时文件缓存
ServletFileUpload upload = new ServletFileUpload(factory);//创建 ServletFileUpload 对象,构造的时候传一个 DiskFileItemFactory 对象进去
upload.setFileSizeMax(1024 * 1024 * 2);//单个文件大小
upload.setHeaderEncoding("gb2312");//设置普通字段名称和文件字段的文件名所采用的字符集编码
upload.setSizeMax(1024 * 1024 * 4);//最多上传2m的文件
List list = null;
try {
list = upload.parseRequest(request);//解析 request 对象 得到一个包含 FileItem 对象的 list
} catch (FileUploadException e) {
out.print("解析文件时出现问题:");
e.printStackTrace();
return;
}
Iterator it = list.iterator();//遍历list
while(it.hasNext()){
FileItem fi = (FileItem)it.next();//类型转换
if(fi.isFormField()){//判断该 FileItem 对象是否是一个普通表单类型
String name = fi.getFieldName();//得到普通表单类型的表单名
String content = fi.getString("GB2312");//用指定编码得到普通表单的值
request.setAttribute(name, content);//把键值放入 request 对象
}else{
try{
String pathStr = fi.getName();//得到文件表单的值,就是用户本地的文件路径
//如果文件表单为空,则不处理
if(pathStr.trim().equals("")){
continue;
}
int start = pathStr.lastIndexOf("//");//得到文件名在路径中的位置
String fileName = pathStr.substring(start + 1);//得到文件名
File pathDest = new File( path , fileName );//创建上传上来的文件对象 由服务器上存放文件的路径 + 文件名 组成
fi.write(pathDest);//写文件
String name = fi.getFieldName();//得到文件表单的名称
request.setAttribute(name, fileName);//把表单名、文件名放入 request
}catch(Exception e){
out.print("存储文件错误:");
e.printStackTrace();
return;
}
finally{//立即删除保存表单字段内容的临时文件
fi.delete();
}
}
}
StringBuffer filelist = new StringBuffer();//得到可变字符串对象
//把上传的文件名拼装到可变字符串中
String file1 = (String)request.getAttribute("file1");
makeUplist(filelist, file1);
String file2 = (String)request.getAttribute("file2");
makeUplist(filelist, file2);
request.setAttribute("list", filelist);//把文件名的字符串放入 request
request.getRequestDispatcher("success.jsp").forward(request, response);//请求转发到指定页面
}
/**
* 将 str 追加到 sb中,以“,”隔开
* @param sb
* @param str
*/
private void makeUplist(StringBuffer sb ,String str){
if(str != null){//追加的字符串为空则不做任何操作
if(sb.length() != 0){//如果可变字符串长度不为0,需要用“,”隔开
sb.append(",");
}
sb.append(str);//追加字符串
}
}
public void init() throws ServletException {
}
}
下面是index.jsp
<%@ page language="java" contentType="text/html; charset=gb2312"
pageEncoding="gb2312"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>传智博客---文件上传</title>
<style type="text/css">
body {
font-size: 100%;
font-family: "Trebuchet MS",Verdana, Arial, Helvetica, sans-serif;
padding-top: 100px;
}
label { display: block; margin-top: 10px; }
#login { width: 300px; margin: 0 auto; border: 1px solid #eee; padding: 25px; background-color: #FFFFCC; }
a { color: #0066CC; text-decoration: none; border-bottom: 1px dotted #0066cc; }
#submit_butt { margin-top: 15px; }
h3 { margin-top: 0; }
</style>
<link href="keyboardstyle.css" type="text/css" rel="stylesheet" />
</head>
<body>
<div id="login">
<h3>文件上传</h3>
<form action="fileupload" method="post" enctype="multipart/form-data">
<label for="username">用户名:</label>
<input type="text" name="name" id="username" />
<label for="pwd">密码:</label>
<input type="text" name="password" id="pwd"/>
<a href="#" id="showkeyboard" title="Type in your password using a virtual keyboard.">键盘</a> <br />
<label for="pwd">文件1:</label>
<input type="file" name="file1" />
<label for="pwd">文件2:</label>
<input type="file" name="file2" />
<br>
<input type="submit" name="Submit" id="submit_butt" value="提交" />
</form>
<div id="keyboard">
<div id="row0">
<input name="accent" type="button" value="`" />
<input name="1" type="button" value="1" />
<input name="2" type="button" value="2" />
<input name="3" type="button" value="3" />
<input name="4" type="button" value="4" />
<input name="5" type="button" value="5" />
<input name="6" type="button" value="6" />
<input name="7" type="button" value="7" />
<input name="8" type="button" value="8" />
<input name="9" type="button" value="9" />
<input name="0" type="button" value="0" />
<input name="-" type="button" value="-" />
<input name="=" type="button" value="=" />
<input name="backspace" type="button" value="Backspace" />
</div>
<div id="row0_shift">
<input name="tilde" type="button" value="~" />
<input name="exc" type="button" value="!" />
<input name="at" type="button" value="@" />
<input name="hash" type="button" value="#" />
<input name="dollar" type="button" value="$" />
<input name="percent" type="button" value="%" />
<input name="caret" type="button" value="^" />
<input name="ampersand" type="button" value="&" />
<input name="asterik" type="button" value="*" />
<input name="openbracket" type="button" value="(" />
<input name="closebracket" type="button" value=")" />
<input name="underscore" type="button" value="_" />
<input name="plus" type="button" value="+" />
<input name="backspace" type="button" value="Backspace" />
</div>
<div id="row1">
<input name="q" type="button" value="q" />
<input name="w" type="button" value="w" />
<input name="e" type="button" value="e" />
<input name="r" type="button" value="r" />
<input name="t" type="button" value="t" />
<input name="y" type="button" value="y" />
<input name="u" type="button" value="u" />
<input name="i" type="button" value="i" />
<input name="o" type="button" value="o" />
<input name="p" type="button" value="p" />
<input name="[" type="button" value="[" />
<input name="]" type="button" value="]" />
<input name="/" type="button" value="/" />
</div>
<div id="row1_shift">
<input name="Q" type="button" value="Q" />
<input name="W" type="button" value="W" />
<input name="E" type="button" value="E" />
<input name="R" type="button" value="R" />
<input name="T" type="button" value="T" />
<input name="Y" type="button" value="Y" />
<input name="U" type="button" value="U" />
<input name="I" type="button" value="I" />
<input name="O" type="button" value="O" />
<input name="P" type="button" value="P" />
<input name="{" type="button" value="{" />
<input name="}" type="button" value="}" />
<input name="|" type="button" value="|" />
</div>
<div id="row2">
<input name="a" type="button" value="a" />
<input name="s" type="button" value="s" />
<input name="d" type="button" value="d" />
<input name="f" type="button" value="f" />
<input name="g" type="button" value="g" />
<input name="h" type="button" value="h" />
<input name="j" type="button" value="j" />
<input name="k" type="button" value="k" />
<input name="l" type="button" value="l" />
<input name=";" type="button" value=";" />
<input name="'" type="button" value="'" />
</div>
<div id="row2_shift">
<input name="a" type="button" value="A" />
<input name="s" type="button" value="S" />
<input name="d" type="button" value="D" />
<input name="f" type="button" value="F" />
<input name="g" type="button" value="G" />
<input name="h" type="button" value="H" />
<input name="j" type="button" value="J" />
<input name="k" type="button" value="K" />
<input name="l" type="button" value="L" />
<input name=";" type="button" value=":" />
<input name="'" type="button" value='"' />
</div>
<div id="row3">
<input name="Shift" type="button" value="Shift" id="shift" />
<input name="z" type="button" value="z" />
<input name="x" type="button" value="x" />
<input name="c" type="button" value="c" />
<input name="v" type="button" value="v" />
<input name="b" type="button" value="b" />
<input name="n" type="button" value="n" />
<input name="m" type="button" value="m" />
<input name="," type="button" value="," />
<input name="." type="button" value="." />
<input name="/" type="button" value="/" />
</div>
<div id="row3_shift">
<input name="Shift" type="button" value="Shift" id="shifton" />
<input name="Z" type="button" value="Z" />
<input name="X" type="button" value="X" />
<input name="C" type="button" value="C" />
<input name="V" type="button" value="V" />
<input name="B" type="button" value="B" />
<input name="N" type="button" value="N" />
<input name="M" type="button" value="M" />
<input name="lt" type="button" value="<" />
<input name="gt" type="button" value=">" />
<input name="?" type="button" value="?" />
</div>
<div id="spacebar">
<input name="spacebar" type="button" value=" " />
</div>
</div>
</div>
<script type="text/javascript" src="js/jquery-1.2.6.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-personalized-1.5.2.min.js"></script>
<script type="text/javascript" src="js/jquery-fieldselection.js"></script>
<script type="text/javascript" src="js/vkeyboard.js"></script>
</body>
</html>