注意:commons-fileupload依赖于commons-io。
package cn.yellowimg.servlet;
import java.io.File;
import java.io.IOException;
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.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import cn.yellowimg.Utils.CommonUtils;
public class Upload2Servlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 创建工厂对象 设置缓存大小与临时目录 20kB
DiskFileItemFactory factory = new DiskFileItemFactory(20 * 1024,
new File("D:/tmp"));
//得到解析器
ServletFileUpload fileUpload = new ServletFileUpload(factory);
/*
* 限制单个文件的大小为100KB 必须在解析之前调用 也就parseRequest方法之前调用
*
* 如果上传文件超出限制 则parseRequest抛出异常
*/
// fileUpload.setFileSizeMax(100*1024);
/*
* 限制整个文件表单的大小
*/
try {
//解析器解析request
List<FileItem> list = fileUpload.parseRequest(request);
FileItem file1 = list.get(1);
//要求保存到根目录下
// 得到根目录
String root = request.getServletContext().getRealPath(
"/WEB-INF/files");
/*
* 生成两级目录
*
* 1 得到文件名称
* 2 得到hashcode
* 3 转换成16进制
* 4 获取前两个字母
*/
String filename = file1.getName();
/*
* 处理文件名的绝对路径
*/
int index = filename.lastIndexOf("\\");
if (index > 0) {
filename = filename.substring(index + 1);
}
/*
* 给文件名加上uuid 处理文件同名问题
*/
filename = CommonUtils.uuid() + "_" + filename;
/*
* 1 得到HashCode
*/
int hashCode = filename.hashCode();
String hex = Integer.toHexString(hashCode);
/*
*
* 获取hex前两个字母 与root链在一起 生成一个完整的路径
*/
File dirFile = new File(root, "/" + hex.charAt(0) + "/"
+ hex.charAt(1));
/*
* 创建目录链
* 若目录存在在不创建 不存在则创建
*/
dirFile.mkdirs();
File destFile = new File(dirFile, filename);
/*
* 保存
*/
try {
file1.write(destFile);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileUploadException e) {
if (e instanceof FileSizeLimitExceededException) {
request.setAttribute("msg", "文件大小超出限制100KB");
request.getRequestDispatcher("/form3.jsp").forward(request,
response);
}
}
}
}
提交表单
<form action="<c:url value='/Upload2Servlet '/>" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="username"><br>
照片:<input type="file" name="picture"><br>
<input type="submit" value="上传">
</form>