本次文件依靠第三方组件(Apache)进行实现
commons-fileupload组件:
拷贝jar包:
commons-fileupload.jar
下载地址: http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi 操作指南: http://commons.apache.org/proper/commons-fileupload/using.html
commons-io.jar
下载地址: http://commons.apache.org/proper/commons-io/download_io.cgi 操作指南: http://commons.apache.org/proper/commons-io/description.html
文件上传的前提
1.form表单的method必须是post
2.form表单的组件得是file属性:比如:<input type="file" name="photoName" >
3.form表单的enctype必须是multipart/form-data
以二进制字节流进行提交 传统接收参数的方式无效
配套代码Demo下载地址:
https://download.csdn.net/download/kese7952/11086493
代码一 演示
jsp上传页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE> <html> <head> <title>MrYang Design File Upload</title> </head> <body> <form action="${pageContext.request.contextPath}/servlet/UploadServlet" enctype="multipart/form-data" method="post" > 名称<input type="text" name="name" ><br/><br/> 密码<input type="text" name="pwd" ><br/><br/> <input type="file" name="photoName" ><br/><br/> <input type="submit" value="上传" > </form> </body> </html>
2.Servlet进行接受表单数据、并且进行处理上传内容
package cn.javabs.web.controller; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; 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.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.FilenameUtils; public class UploadServlet extends HttpServlet { @SuppressWarnings("unchecked") public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * Set CharEncoding */ response.setContentType("text/html ;charset = utf-8 "); response.setCharacterEncoding("utf-8"); request.setCharacterEncoding("utf-8"); String name = request.getParameter("photoName"); // 1. 用于判断jsp表单中的enctype 的属性值是不是multipart/form-data boolean isMultipart = ServletFileUpload.isMultipartContent(request); // 如果不是multipart/form-data 则提醒 if (!isMultipart) { response.getWriter().write("提交的不是multipart/form-data"); return; } //实例化 磁盘文件项工厂对象 DiskFileItemFactory factory = new DiskFileItemFactory(); //ServletFileUpload是用于解析request对象 ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = null; try { // 通过ServletFileUpload得到所有上传项.每一个FileItem就相当于一个上传项 items = upload.parseRequest(request); } catch (FileUploadException e) { throw new RuntimeException(e); } System.out.println("我们来一起看一下items是:" + items); // 循环取出所有的组件 其中组件包含有 普通组件 和 上传组件 for (FileItem item : items) { // 通过判断确定 item中的普通组件 使用的判断方法是isFormField // 是普通的表单字段 if(item.isFormField()){ System.out.println("这是普通的表单字段"); // 获取表单中的属性 String fieldName = item.getFieldName(); // 获取表单中的属性所对应的值 String fieldValue = item.getString(); System.out.println(fieldName +":" + fieldValue); } // 是上传的表单字段 else{ System.out.println("这是上传的表单字段"); // 获取字节输入流 InputStream in = item.getInputStream(); // 获取上传文件的名称 String uploadName = item.getName(); // 判断上传文件的名称是否为null,如果不为空 if(uploadName != null){ // 文件名称 = 获取文件名称,并且包含后缀 uploadName = FilenameUtils.getName(uploadName); } // 文件存放的真实路径 其实files文件夹 存放在Tomcat服务器的项目里面 String filePath = getServletContext().getRealPath("/files"); // 根据真实的路径 进行实例化创建目录 File file = new File(filePath); // 如果目录不存在 if(!file.exists()){ //创建多级目录 file.mkdirs(); } // 根据 真实目录 + "\" + 文件名称 [file.separator 的结果是 "\"] OutputStream out = new FileOutputStream(filePath + file.separator + uploadName ); // 定义长度 初始化值为0 int len = 0; //定义字节缓冲区数组 byte [] b = new byte[1024]; // 循环 while ((len = in.read(b))!=-1) { out.write(b, 0, len); } // 关闭输出流 out.close(); // 关闭输入流 in.close(); // 删除临时文件 item.delete(); } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
最后还有一个核心配置文件web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name></display-name> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>cn.javabs.web.controller.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/servlet/UploadServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>