Servlet文件上传

来源:互联网 发布:做菜教学视频软件 编辑:程序博客网 时间:2024/06/17 12:33

两点要素:
1.表单提交方式必须是post
2.enctype要指定为multipart/form-data。
这里写图片描述

enctype的默认值是application/x-www-form-urlencoded
这种编码格式只支持键值对的数据,且只能是字符串,无法传输文件。

需要的jar包:
这里写图片描述

实现:

import java.io.BufferedInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintWriter;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;public class UploadServlet extends HttpServlet {    //文件夹路径常量    private static String TEMP_PATH = "E:/Learning/temp/170926";    private static final long serialVersionUID = 3364746345428715093L;    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html;charset=UTF-8");        PrintWriter out = response.getWriter();        // 判断内容是否包含文件        boolean isMultipart = ServletFileUpload.isMultipartContent(request);        // 判断是否是文件上传请求        if (!isMultipart) {            out.println("Error : 表单必须包含 enctype=multipart/form-data");            return;        }        // 用于创建解析文件上传的工厂类        DiskFileItemFactory factory = new DiskFileItemFactory();        // 用于从请求中解析出文件        ServletFileUpload upload = new ServletFileUpload(factory);        try {            // 获取所有提交过来的文件(包含表单内容) 这个FileItem叫做一个项,这个项有可能是文件也有可能是表单参数             List<FileItem> items = upload.parseRequest(request);            // 定义一个输出流            FileOutputStream fos = null;            //缓冲区            byte [] buf = new byte[8192];            if (items != null && items.size() > 0) { // 不为空且长度大于0则遍历之                for (FileItem item : items) {                    if (item.isFormField()) { // isFormField = true 文本框的值                        out.println("用户名: " + item.getString() + "<br />");                    } else {                        //获取输入流                        BufferedInputStream bis = new BufferedInputStream(item.getInputStream());                        //初始化本地输出流                        fos = new FileOutputStream(new File(TEMP_PATH + "/" + item.getName()));                        int len = -1;                        while ((len = bis.read(buf)) != -1) {                            fos.write(buf , 0 , len);                            fos.flush();                        }                        out.println("文件: " + item.getName() + "已上传 <br />");                    }                }            }        } catch (FileUploadException e) {            out.println("Error: 文件解析异常");        }    }}