实现文件上传:
1.jar包
需要用到两个jar包: commons-io.jar commons-fileupload.jar 下载地址:https://mvnrepository.com/
2.from表单:
2.1.多部分(enctype="multipart/form-data")表单
2.2.请求必须是post请求, 因为get请求文件只支持2k-4k左右
3.servlet:
实现文件上传需要用到一个核心类:ServletFileUpload
实现代码: (代码已注释)
package cn.happy.Servlet; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.List; public class FileUploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //实现文件上传需要用到一个核心类:ServletFileUpload //1.判断是否为多部分表单使用ServletFileUpload的isMultiPartContent()方法。 boolean isMulti = ServletFileUpload.isMultipartContent(request); //FileItemFactory是一个接口,接口不可以new 接口,只能new他的实现类 // ctrl+鼠标左键进入FileItemFactory接口 ctrl+T可以看到他的实现类。他有一个叫DiskFileItemFactory的实现类 // 去new DiskFileItemFactory实现类 FileItemFactory factory=new DiskFileItemFactory(); //2.实例化ServletFileUpload ServletFileUpload servletFileUpload =new ServletFileUpload(factory);//需要传入一个FileItemFactory try { List<FileItem> fileItems = servletFileUpload.parseRequest(request); String value=null; for (FileItem item:fileItems) { if (item.isFormField()){//表单中的字段为普通字段进入if内 String name = item.getFieldName();//获取普通表单字段的name if (name.equals("tname")){ value = item.getString(); System.out.println(value); } }else{//文件域表单字段进入else内 //获取到文件域字段 String childPath = item.getName(); //获取存放地址的全路径,这里把upload放在WEB-INF目录下是因为客户不可以直接访问WEB-INF目录 String realPath = request.getSession().getServletContext().getRealPath("/WEB-INF/FileUploads"); System.out.println("path====:"+realPath); //String parent, String child传入一个父路径,一个子路径, File fileDir = new File(realPath); if (!fileDir.exists()) { fileDir.setWritable(true); //mkdir 单层创建 , mkdirs 逐层创建 fileDir.mkdirs(); } File file=new File(realPath,childPath); try { item.write(file); } catch (Exception e) { e.printStackTrace(); } } } request.setAttribute("tvalue",value); request.getRequestDispatcher("/come.jsp").forward(request,response);//页面跳转 } catch (FileUploadException e) { e.printStackTrace(); } } }
servlet中:FileItemFactory是一个接口,接口只能new实现类。 对准FileItemFactory Ctrl+T可以看到接口的实现类
在实现文件上传存放目录时,File的参数是String parent, String child ,进入File Ctrl+O 查看类中定义了那些方法,文件上传使用的是File的这个有参构造
红框的地方:去判断路径的文件夹是否存在,如果不存在就创建出文件夹。
这里在WEB-INF目录下创建文件夹存放文件是因为WEB-INF目录下的内容,客户端不可以直接访问。安全性比较高
4.页面代码:
FileUpload.jsp:
<%-- Created by IntelliJ IDEA. User: 秀清风 Date: 2018/12/23 Time: 21:27 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>文件上传</title> </head> <body> <%--文件上传 1.多部分(enctype="multipart/form-data")表单 2.请求必须是post请求, 因为get请求文件只支持2k-4k左右 --%> <form action="${pageContext.request.contextPath}/fileUploadServlet" method="post" enctype="multipart/form-data"> 上传者姓名:<input type="text" name="tname"> 选择文件:<input type="file" name="upload"><br> <input type="submit" value="点击上传"> </form> </body> </html>
come.jsp:
<%-- Created by IntelliJ IDEA. User: 秀清风 Date: 2018/12/24 Time: 14:14 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <h2>嗨!你好${tvalue}</h2> </body> </html>
上传的文件没有存放在你项目中的目录,而是存放在了tomcat中的目录。
如果要知道上传的文件在哪里存放,两种方式
1.后台打印出存放目录,去磁盘中寻址
2.可以在tomcat服务器中寻址到存放目录。
展示:
文件存放目录: