一、前言
在Javaweb中,上传下载是经常用到的功能,对于文件上传,浏览器在上传的过程中是以流的过程将文件传给服务器,一般都是使用commons-fileupload这个包实现上传功能,因为commons-fileupload依赖于commons-io这个包,所以需要下载这两个包commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar,笔者已经打包好(点击下载)
1、搭建环境
创建Web项目,将包导入到项目lib下
2、实现文件上传
(第一种上传的方法)
新建upload.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>upload file</title> </head> <body> <!--这里的<%=request.getContextPath()%>是表示项目的绝对路径,也就是说不管你以后将项目拷贝到哪个位置,它都会找到准确的路径 --> <form action="<%=request.getContextPath()%>/uploadServlet" enctype="multipart/form-data" method="post"> <span>选择文件:</span><input type="file" name="file1"> <input type="submit" value="上传"> </form> </body> </html>
新建处理文件上传的Servlet
package com.load; import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; 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; @WebServlet("/uploadServlet") public class uploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; public uploadServlet() { super(); } /* fileupload 包中, HTTP 请求中的复杂表单元素都被看做一个 FileItem 对象; * FileItem 对象必须由 ServletFileUpload 类中的 parseRequest() 方法解析 HTTP 请求 * (即被包装之后的 HttpServletRequest 对象)出来,即分离出具体的文本表单和上传文件 * */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //通过isMultipartContent()方法:分析请求里面是不是有文件上的请求, boolean isMultipart = ServletFileUpload.isMultipartContent(request); if(isMultipart){ //创建可设置的磁盘节点工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //获取请求的上下文信息 ServletContext servletContext = request.getServletContext(); //缓存目录,每个服务器特定的目录 File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); //设置服务器的缓存目录 factory.setRepository(repository); //ServletFileUpload 对象的创建需要依赖于 FileItemFactory //工厂将获得的上传文件 FileItem 对象保存至服务器硬盘,即 DiskFileItem 对象。 ServletFileUpload upload = new ServletFileUpload(factory); try { //解析即被包装之后的 HttpServletRequest对象,既是分离文本表单和上传文件(http请求会被包装为HttpServletRequest) List<FileItem> items = upload.parseRequest(request); for(FileItem item:items){ String fieldName = item.getFieldName(); String fileName = item.getName(); String contentType = item.getContentType(); boolean isInMemory = item.isInMemory(); long sizeInBytes = item.getSize(); //实例化一个文件 //request.getRealPath(获取真实路径) File file = new File(request.getRealPath("/")+"/loads"+fileName.substring(fileName.lastIndexOf("\\")+1,fileName.length())); item.write(file); } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
(第二种上传的方法)
新建Jsp页面(同上,只是路径改变下)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>upload file</title> </head> <body> <!--这里的<%=request.getContextPath()%>是表示项目的绝对路径,也就是说不管你以后将项目拷贝到哪个位置,它都会找到准确的路径 --> <form action="<%=request.getContextPath()%>/uploadservlet1" enctype="multipart/form-data" method="post"> <span>选择文件:</span><input type="file" name="file1"> <input type="submit" value="上传"> </form> </body> </html>