1.编写上传页面form表单
<form id="form1" action="${pageContext.request.contextPath }/upfileservlet" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username" /><br>
电话:<input type="text" name="telphone" /><br>
文件:<input type="file" name="file" /><br>
<input type="button" value="再添加一张图片" onclick="addfile(this)"><br/>
<input type="submit" value="提交" />
form>
<script type="text/javascript">
var num=2;
function addfile(obj){
//alert("xxx");
//dom操作
//添加div
var div1=document.createElement("div");
//添加input标签
var inputfile=document.createElement("input");
inputfile.type="file";
inputfile.name="myfile"+num;
num++;
//添加删除按钮
var del=document.createElement("input");
del.type="button";
del.value="删除";
del.οnclick=function(){
this.parentNode.remove();
};
div1.append(inputfile);
div1.append(del);
var form1=document.getElementById("form1");
form1.insertBefore(div1,obj);
}
script>
2.编写servlet处理界面
/**
* 处理文件上传的方法
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 得到上传路径,将上传的路径放入WEB-INF下,不予许外界访问,保证上传文件的安全性
String path = request.getServletContext().getRealPath("WEB-INF//upload");
File file = new File(path);
// 如果文件不存在就创建
if (!file.exists()) {
file.mkdirs();
}
// 创建DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置工厂缓冲大小
factory.setSizeThreshold(1024 * 100);// 默认为10K
// 设置上传文件的缓存目录
// factory.setRepository(repository);
// 创建一个文件解析器
ServletFileUpload upload = new ServletFileUpload(factory);
// 解决中文乱码问题
upload.setHeaderEncoding("utf-8");
// 监听上传文件的进度
upload.setProgressListener(new ProgressListener() {
@Override
public void update(long arg0, long arg1, int arg2) {
System.out.println("文件大小为:" + arg1 + ",当前已处理:" + arg0 + ",序号:" + arg2);
}
});
// 判断提交的数据是不是表单数据
if (ServletFileUpload.isMultipartContent(request)) {
try {
// 设置上传单个文件的大小
upload.setFileSizeMax(1024 * 100);// 大小为100KB
// 设置所有文件总量的最大值
upload.setSizeMax(1024 * 1024 * 10);// 大小为10M
// 解析数据,放回一个list集合,存放数据项
List fileItems = upload.parseRequest(request);
for (FileItem fileItem : fileItems) {
// 判断是不是普通输入项的数据
if (fileItem.isFormField()) {
// 获得数据项的名字
String name = fileItem.getFieldName();
String value = fileItem.getString("utf-8");
System.out.println(name + "..." + value);
} else {// 封装的是文件
// 得到上传文件的名字
String name = fileItem.getName();
// 如果文件名为空
if (name == null || name.trim().equals("")) {
continue;
}
// 不同的浏览器传入的名字可能存在路径,解决文件名带有路径问题
String filename = name.substring(name.lastIndexOf("\\") + 1);
//控制文件传的类型
String ext = filename.substring(filename.lastIndexOf(".")+1);
if (!UUIDUtils.exts.contains(ext)) {
response.getWriter().write("文件类型不支持");
return;
}
// 调用工具类,得到唯一标识
String fileName = UUIDUtils.getFileName(filename);
// 调用工具类,得到目录
String newPath = UUIDUtils.makeFilePath(filename, path);
// 获得输入流
InputStream is = fileItem.getInputStream();
FileOutputStream fos = new FileOutputStream(newPath + "\\" + fileName);
// 写入硬盘
byte[] bs = new byte[1024];
int len = 0;
while ((len = is.read(bs)) != -1) {
fos.write(bs, 0, len);
}
// 关流
fos.close();
is.close();
// 删除文件上传时生成的临时文件
fileItem.delete();
System.out.println("文件上传成功");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
System.out.println("文件上传失败");
}
} else {
// 正常处理
// request.getParameter("username");
}
}
3.编写工具类
/**
* uuid工具类
* @author 15216
*
*/
public class UUIDUtils {
//创建集合存储文件的类型
public static List exts;
//静态代码块初始化文件的类型
static {
exts = new ArrayList();
//exts.add(".jpg");
exts.add(".png");
exts.add(".zip");
}
public static String getFileName(String filename) {
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
return uuid+"_"+filename;
}
public static String makeFilePath(String filename,String filepath) {
//得到字符串的hascode值
int code = filename.hashCode();
//0x十六进制前缀
int dir1 = code&0xf;//得到后四位二进制数
int code1 = code>>4;//右移四位
int dir2=code1&0xf;//得到后八位的前四位
String path = filepath+"\\"+dir1+"\\"+dir2;
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
return path;
}
}
代码实现
//注解配置文件上传的最大值
@MultipartConfig(fileSizeThreshold=1024*1024,maxFileSize=1024*100,maxRequestSize=1024*1024 )
/**
* servlet3.0
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取路径
String path = request.getServletContext().getRealPath("WEB-INF//upload");
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
//接收数据
Collection parts = request.getParts();
if (parts!=null) {
for (Part part : parts) {
//获取文件名
String fileName = part.getSubmittedFileName();
//如果为空不是文件
if (fileName!=null) {//是文件
if (fileName.trim().equals("")) {
continue;
}
//form-data; name="myfile1"; filename="D:\图片\timg.jpg"
String header = part.getHeader("content-disposition");
System.out.println(header);
String name1 = header.split("; ")[2];//filename="D:\图片\timg.jpg"
System.out.println(name1);//"D:\图片\timg.jpg"
String name2 = name1.substring(name1.indexOf("\"")+1, name1.length()-1);
fileName = name2.substring(name2.lastIndexOf("\\")+1);
System.out.println(fileName);
//为文件名产生一个唯一标识
String filename = UUIDUtils.getFileName(fileName);
String filepath = UUIDUtils.makeFilePath(filename, path);
part.write(filepath+"\\"+filename);
System.out.println("文件上传成功");
}else {
//获取普通数据的名字
String name = part.getName();
String value = request.getParameter(name);
System.out.println(name+"..."+value);
}
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取文件路径
String path = request.getServletContext().getRealPath("WEB-INF//upload");
File file = new File(path);
Map map = new HashMap();
listFile(file, map);
//将集合放入request中
request.setAttribute("map", map);
//转发到列表jsp,数据不会丢失
request.getRequestDispatcher("/listfile.jsp").forward(request, response);
}
/**
* 通过递归将目标目录下的文件全部存到map集合中
* @param dir
* @param map
*/
public void listFile(File dir,Map map) {
File[] files = dir.listFiles();
if (files!=null) {
for (File file : files) {
//判断是不是目录
if (file.isDirectory()) {
listFile(file, map);
}else {
//得到文件的名字
String uuid_name = file.getName();//uuid_xxx.jpg
//截取文件的名字
String realname = uuid_name.substring(uuid_name.indexOf("_")+1);
//将得到文件的名字作为key值,将realname作为值存入集合
map.put(uuid_name, realname);
}
}
}
}
<body>
<h2>下载h2>
<c:forEach items="${map }" var="entry">
<c:url var="myurl" value="/downfileservlet">
<c:param name="filename" value="${entry.key }">c:param>
c:url>
${entry.value } <a href="${myurl }">下载a>
c:forEach>
body>
/**
* 文件下载
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//接收要下载的文件名
String filename = request.getParameter("filename");
//得到路径名
String path = request.getServletContext().getRealPath("WEB-INF//upload");
if (filename==null||filename.trim().equals("")) {
return;
}
//获取文件在upload中的位置
String name = filename.substring(filename.indexOf("_")+1);
//传入的是包含唯一编码的文件名
String filepath = UUIDUtils.makeFilePath(filename, path);
File file = new File(filepath+"\\"+filename);
System.out.println(file);
if (!file.exists()) {
response.getWriter().write("文件不存在");
return;
}
//设置头
response.setHeader("content-disposition", "attachment;filename"+URLDecoder.decode(name,"utf-8"));
ServletOutputStream os = response.getOutputStream();
FileInputStream fis = new FileInputStream(file);
int len = 0;
byte[] bs = new byte[1024];
while((len = fis.read(bs))!=-1) {
os.write(bs,0,len);
}
fis.close();
}