基于servlet完成文件上传功能_方式一【原始手写流开发版】
本次文件依靠第三方组件(Apache)进行实现
commons-fileupload组件:
下载jar包:
commons-fileupload.jar
jar包下载地址: http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi 操作指南: http://commons.apache.org/proper/commons-fileupload/using.html
commons-io.jar
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属性:比如:
3.form表单的enctype必须是multipart/form-data
以二进制字节流进行提交 传统接收参数的方式无效
代码演示
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>MrYang Design File Upload
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); Listitems = 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"?>UploadServlet cn.javabs.web.controller.UploadServlet UploadServlet /servlet/UploadServlet index.jsp