文件上传下载:
package cn.zc.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet {
/**
* Constructor of the object.
*/
public UploadServlet() {
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("UploadServlet1");
//判断表格的提交方式是否是multipart/form-data类型
if(!ServletFileUpload.isMultipartContent(request)){
//如果不是该类型,采用普通方式处理。
//response.setContentType("text/html;charset=utf-8");
//PrintWriter out = response.getWriter();
//request.getParameter("user");//此时便可以使用request.getParameter方法
//为了方便在此直接退出
System.out.println("不是文件上传处理");
return ;
}
System.out.println("UploadServlet21");
//创建一个解析工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
//设置阀值,大于此值时创建临时文件
factory.setSizeThreshold(1024*1024*10);
System.out.println("UploadServlet22");
//设置临时缓存文件的保存目录
factory.setRepository(new File(this.getServletContext().getRealPath("/temp")));
System.out.println("UploadServlet23");
//得到解析器对象
ServletFileUpload upload=new ServletFileUpload(factory);
//设置文件上传的大小10M
upload.setFileSizeMax(1024*1024*100);
System.out.println("UploadServlet24");
//设置保存文件的编码方式,
upload.setHeaderEncoding("UTF-8");
try{
//定义规定上传文件的类型
String[]arr={".jpg",".zip",".txt",".ppt",".pptx",".doc",".docx",".xls",".gif"};
//将类型放到List中
List fileStandType=Arrays.asList(arr);
System.out.println("UploadServlet25");
List items = new ArrayList();
items = upload.parseRequest(request);
//对请求进行解析,有几个输入项就会有几个FileItem对象
System.out.println("UploadServlet3");
Iterator it = items.iterator();
while(it.hasNext()){
FileItem item = (FileItem)it.next();
System.out.println("UploadServlet4");
//判断输入元素的类型,
if(item.isFormField()){//是普通项
System.out.println("UploadServlet5");
//得到name属性
String inputName=item.getFieldName();
//得到相对应的值
String inputValue=item.getString("UTF-8");//可指定字符编码,以防乱码
System.out.println("inputName: "+inputName+" : "+"inutValue: "+inputValue);
}else{//是上传文件输入项
//获取上传文件名称
System.out.println("UploadServlet6");
String fileName=item.getName();
//判断fileName是否为空即是否真的选择了上传文件,不为空继续
if(!fileName.trim().equals("")){
System.out.println("UploadServlet7");
//对文件名进行处理得到文件名
fileName=fileName.substring(fileName.lastIndexOf("\\")+1);
System.out.println("fileName: "+ fileName);
//得到文件后缀判断文件类型
String fileType=fileName.substring(fileName.lastIndexOf("."));
System.out.println("fileType: "+fileType);
//判断是否是制定的文件类型,暂时未用到
if(!fileStandType.contains(fileType)){
//如果不是制定类型的文件跳转页面,
System.out.println("文件类型不匹配");
request.setAttribute("fileTypeError","只能上传指定类型的文件,jpg/zip/txt/ppt/pptx/docx/doc/xls/gif");
request.getRequestDispatcher("/handler.jsp").forward(request, response);
return ;
}
//文件已选择,得到输入流
InputStream in=item.getInputStream();
//将上传的文件保存在服务器受保护的WEB-INF的目录下,
String savePath=this.getServletContext().getRealPath("WEB-INF/upload");
savePath=getFilePath(savePath,fileName);
//同名文件覆盖问题对fileName进行进一步处理,工具类UUID
fileName=UUID.randomUUID().toString()+"_"+fileName;
//构建输出流
FileOutputStream fos=new FileOutputStream(savePath+"\\"+fileName);
byte[] buffer=new byte[1024];
//int len=0;
while(in.read(buffer)>0){
fos.write(buffer);
fos.flush();
}
in.close();
fos.close();
request.setAttribute("finish","上传成功!");
item.delete();//在关闭流之后,删除临时缓存文件
}
}
}
}catch(Exception e){
request.setAttribute("finish","上传失败!");
}
request.getRequestDispatcher("/handler.jsp").forward(request, response);
}
//方法对文件保存目录进行处理,
public String getFilePath(String path,String fileName){
//产生目录结构的算法:hash目录
int dir1=fileName.hashCode()&0x0f;//一级目录
int dir2=fileName.hashCode()>>4 &0x0f;//二级目录
String savePath=path+"\\"+dir1+"\\"+"\\"+dir2;
File file=new File(savePath);
if(!file.exists()){
file.mkdirs();
}
return savePath;
}
public void init() throws ServletException {
// Put your code here
}
}
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>文件上传</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <script type="text/javascript"> function addElement() { //得到隐藏input里面的value值 var index = document.getElementById("hidden").getAttribute("value"); if(index>4){ alert("最大同时上传4个文件"); return false; } //创建一个input类型的节点 var inputElement = document.createElement("input"); //设置新创建的节点的属性,类型为file,name值递增 inputElement.setAttribute("type", "file"); inputElement.setAttribute("name", "file" + index); //创建文本节点 var fontElement = document.createTextNode("选择文件:"); //将创建的文本节点添加到div中 document.getElementById("upload_div").appendChild(fontElement); //将创建的input类型的节点添加到div中 document.getElementById("upload_div").appendChild(inputElement); //创建一个换行 var brElement = document.createElement("br"); //添加到div中 document.getElementById("upload_div").appendChild(brElement); //将隐藏input里面的value值加1 document.getElementById("hidden").setAttribute("value",parseInt(index) + 1); } function deleteElement() { //因为add方法添加了3个节点循环三次 for ( var i = 0; i < 3; i++) { //删除最后一个节点 document.getElementById("upload_div").removeChild(document.getElementById("upload_div").lastChild); } //将隐藏input里面的value值设为1 document.getElementById("hidden").setAttribute("value",1); } </script> </head> <body> <form action="${pageContext.request.contextPath}/servlet/UploadServlet" method="post" enctype="multipart/form-data"> <input type="hidden" name="hidden" value="file" id="fileload"> 用户: <input type="text" name="user" id="txtinput" > <input type="button" value="上传文件" onclick="addElement()"> <input type="button" value="删除" onclick="deleteElement()"> <div id="upload_div" style="width: 300px;"> </div> <input type="submit" value="提交"> </form> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'handler.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <%=request.getAttribute("fileTypeError") %> <%=request.getAttribute("finish") %> </body> </html>
1、这里要注意设定上传文件的大小,设置太小了文件上传下面的方法转化的request的值为空。
ServletFileUpload.parseRequest(request);
2、注意上传页面的form表单属性enctype="multipart/form-data"