1. 首先需要下载需要的组件。
下载commons-fileupload-1.2.1-bin.zip,下载网址:
http://commons.apache.org/downloads/download_fileupload.cgi
下载commons-io-1.4-bin.zip,下载网址:
http://commons.apache.org/downloads/download_io.cgi
2. 用开源的FileUpload组件,可以很方便的给自己的系统添加功能强大的文件上传模块。下图为文件上传的基本流程图。
3. 将commons-fileupload-1.2.1-bin.zip包中的commons-fileupload-1.2.1.jar文件和commons-io-1.4-bin.zip包中的commons-io-1.4.jar文件拷贝到web工程下的WEB-INF\lib目录下。
4. 在服务器端创建处理文件上传的Servlet类。源代码如下:
Java代码
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/89a1c38fb0362c10071f691056730048.gif)
- packagecom.bjsxt.shopping.servlet;
- importjava.io.File;
- importjava.io.IOException;
- importjava.io.PrintWriter;
- importjava.util.Iterator;
- importjava.util.List;
- importjavax.servlet.ServletException;
- importjavax.servlet.http.HttpServlet;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpServletResponse;
- importorg.apache.commons.fileupload.FileItem;
- importorg.apache.commons.fileupload.FileUploadException;
- importorg.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
- importorg.apache.commons.fileupload.disk.DiskFileItemFactory;
- importorg.apache.commons.fileupload.servlet.ServletFileUpload;
- publicclassFileUploadServletextendsHttpServlet
- {
- privatestaticfinallongserialVersionUID=1L;
- publicFileUploadServlet()
- {
- super();
- }
- protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException
- {
- this.doPost(request,response);
- }
- protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException
- {
- request.setCharacterEncoding("utf-8");
- finallongMAX_SIZE=300*1024*1024;//设置上传文件最大值
- //允许上传的文件格式的列表
- finalString[]allowedExt=newString[]{"jpg","jpeg","gif","txt","doc","mp3","wma","m4a","rar","zip"};
- response.setContentType("text/html");
- //设置字符编码为UTF-8,统一编码,处理出现乱码问题
- response.setCharacterEncoding("UTF-8");
- //实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
- DiskFileItemFactorydfif=newDiskFileItemFactory();
- dfif.setSizeThreshold(4096);//设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
- dfif.setRepository(newFile(request.getRealPath("/")+"ImagesUploadTemp"));//设置存放临时文件的目录,web根目录下的ImagesUploadTemp目录
- //用以上工厂实例化上传组件
- ServletFileUploadsfu=newServletFileUpload(dfif);
- //设置最大上传大小
- sfu.setSizeMax(MAX_SIZE);
- PrintWriterout=response.getWriter();
- //从request得到所有上传域的列表
- ListfileList=null;
- try
- {
- fileList=sfu.parseRequest(request);
- }catch(FileUploadExceptione)
- {//处理文件尺寸过大异常
- if(einstanceofSizeLimitExceededException)
- {
- out.println("文件尺寸超过规定大小:"+MAX_SIZE+"字节<p/>");
- out.println("<ahref=\"./admin/manager/productlist.jsp\">返回</a>");
- return;
- }
- e.printStackTrace();
- }
- //没有文件上传
- if(fileList==null||fileList.size()==0)
- {
- out.println("请选择上传文件<p/>");
- out.println("<ahref=\"./admin/manager/productlist.jsp\">返回</a>");
- return;
- }
- //得到所有上传的文件
- IteratorfileItr=fileList.iterator();
- //循环处理所有文件
- while(fileItr.hasNext())
- {
- FileItemfileItem=null;
- Stringpath=null;
- longsize=0;
- //得到当前文件
- fileItem=(FileItem)fileItr.next();
- //忽略简单form字段而不是上传域的文件域(<inputtype="text"/>等)
- if(fileItem==null||fileItem.isFormField())
- {
- continue;
- }
- //得到文件的完整路径
- path=fileItem.getName();
- //得到文件的大小
- size=fileItem.getSize();
- if("".equals(path)||size==0)
- {
- out.println("请选择上传文件<p/>");
- out.println("<ahref=\"./admin/manager/productlist.jsp\">返回</a>");
- return;
- }
- //得到去除路径的文件名
- Stringt_name=path.substring(path.lastIndexOf("\\")+1);
- //得到文件的扩展名(无扩展名时将得到全名)
- Stringt_ext=t_name.substring(t_name.lastIndexOf(".")+1);
- //拒绝接受规定文件格式之外的文件类型
- intallowFlag=0;
- intallowedExtCount=allowedExt.length;
- for(;allowFlag<allowedExtCount;allowFlag++)
- {
- if(allowedExt[allowFlag].equals(t_ext))
- break;
- }
- if(allowFlag==allowedExtCount)
- {
- out.println("请上传以下类型的文件<p/>");
- for(allowFlag=0;allowFlag<allowedExtCount;allowFlag++)
- out.println("*."+allowedExt[allowFlag]+"");
- out.println("<p/><ahref=\"./admin/manager/productlist.jsp\">返回</a>");
- return;
- }
- //longnow=System.currentTimeMillis();
- //根据系统时间生成上传后保存的文件名
- //Stringprefix=String.valueOf(now);
- //保存的最终文件完整路径,保存在web根目录下的ImagesUploaded目录下
- //Stringu_name=request.getRealPath("/")+"ImagesUploaded/"
- //+prefix+"."+t_ext;
- Stringfilename=t_name;
- System.out.println(t_name);
- try
- {
- //保存文件到C:\\upload目录下
- fileItem.write(newFile("C:\\upload\\"+filename));
- //System.out.println(filename);
- out.println("文件上传成功.已保存为:"+filename+"文件大小:"+size+"字节<p/>");
- out.println("<ahref=\"./admin/manager/productlist.jsp\">继续上传</a>");
- }catch(Exceptione)
- {
- e.printStackTrace();
- }
- }
- }
- }
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.FileUploadBase.SizeLimitExceededException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; public FileUploadServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final long MAX_SIZE = 300 * 1024 * 1024;// 设置上传文件最大值 // 允许上传的文件格式的列表 final String[] allowedExt = new String[] {"jpg", "jpeg", "gif", "txt", "doc","mp3", "wma", "m4a","rar","zip" }; response.setContentType("text/html"); // 设置字符编码为UTF-8, 统一编码,处理出现乱码问题 response.setCharacterEncoding("UTF-8"); // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload DiskFileItemFactory dfif = new DiskFileItemFactory(); dfif.setSizeThreshold(4096);// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘 dfif.setRepository(new File(request.getRealPath("/") + "ImagesUploadTemp"));// 设置存放临时文件的目录,web根目录下的ImagesUploadTemp目录 // 用以上工厂实例化上传组件 ServletFileUpload sfu = new ServletFileUpload(dfif); // 设置最大上传大小 sfu.setSizeMax(MAX_SIZE); PrintWriter out = response.getWriter(); // 从request得到所有上传域的列表 List fileList = null; try { fileList = sfu.parseRequest(request); } catch (FileUploadException e) {// 处理文件尺寸过大异常 if (e instanceof SizeLimitExceededException) { out.println("文件尺寸超过规定大小:" + MAX_SIZE + "字节<p />"); out .println("<a href=\"FileUpload.html\" target=\"_top\">返回</a>"); return; } e.printStackTrace(); } // 没有文件上传 if (fileList == null || fileList.size() == 0) { out.println("请选择上传文件<p />"); out.println("<a href=\"FileUpload.html\" target=\"_top\">返回</a>"); return; } // 得到所有上传的文件 Iterator fileItr = fileList.iterator(); // 循环处理所有文件 while (fileItr.hasNext()) { FileItem fileItem = null; String path = null; long size = 0; // 得到当前文件 fileItem = (FileItem) fileItr.next(); // 忽略简单form字段而不是上传域的文件域(<input type="text" />等) if (fileItem == null || fileItem.isFormField()) { continue; } // 得到文件的完整路径 path = fileItem.getName(); // 得到文件的大小 size = fileItem.getSize(); if ("".equals(path) || size == 0) { out.println("请选择上传文件<p />"); out .println("<a href=\"FileUpload.html\" target=\"_top\">返回</a>"); return; } // 得到去除路径的文件名 String t_name = path.substring(path.lastIndexOf("\\") + 1); // 得到文件的扩展名(无扩展名时将得到全名) String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1); // 拒绝接受规定文件格式之外的文件类型 int allowFlag = 0; int allowedExtCount = allowedExt.length; for (; allowFlag < allowedExtCount; allowFlag++) { if (allowedExt[allowFlag].equals(t_ext)) break; } if (allowFlag == allowedExtCount) { out.println("请上传以下类型的文件<p />"); for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++) out.println("*." + allowedExt[allowFlag] + ""); out .println("<p /><a href=\"FileUpload.html\" target=\"_top\">返回</a>"); return; } long now = System.currentTimeMillis(); // 根据系统时间生成上传后保存的文件名 String prefix = String.valueOf(now); // 保存的最终文件完整路径,保存在web根目录下的ImagesUploaded目录下 // String u_name = request.getRealPath("/") + "ImagesUploaded/" // + prefix + "." + t_ext; String filename = prefix + "." + t_ext; try { // 保存文件到C:\\upload目录下 fileItem.write(new File("C:\\upload\\"+filename)); System.out.println(filename); out.println("文件上传成功. 已保存为: " + prefix + "." + t_ext + " 文件大小: " + size + "字节<p />"); out .println("<a href=\"FileUpload.html\" target=\"_top\">继续上传</a>"); } catch (Exception e) { e.printStackTrace(); } } } }
5. 在客户端创建上传文件页面
Html代码
![复制代码](https://i-blog.csdnimg.cn/blog_migrate/89a1c38fb0362c10071f691056730048.gif)
1.<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> 2.<html> 3.<head> 4.<metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"> 5.<title>文件上传</title> 6.</head> 7.<body> 8.<formaction="FileUploadServlet"method="post" 9.enctype="multipart/form-data"> 10.<inputtype="file"size="30" 11.name="file01"/><br/> 12.<inputtype="file"size="30" 13.name="file02"/><br/> 14.<inputname="up"type="submit"value="上传"/></form> 15.</body> 16.</html>