zoukankan      html  css  js  c++  java
  • Servlet 文件上传

    Servlet 可以与 HTML form 标签一起使用,来允许用户上传文件到服务器。上传的文件可以是文本文件或图像文件或任何文档。

    本文使用到的文件有:

    创建一个文件上传表单

    下面的 HTML 代码创建了一个文件上传表单。以下几点需要注意:

    • 表单 method 属性应该设置为 POST 方法,不能使用 GET 方法。 
    • 表单 enctype 属性应该设置为 multipart/form-data. 多部分表单    参考深入解析multipart/form-data
    •  使用multipart/form-data.  后   使用request.getParameter()  将返回空值  因为是分部分的 请求体  有个分割线的 属性  无法直接获得参数
    • 表单 action 属性应该设置为在后端服务器上处理文件上传的 Servlet 文件。下面的实例使用了 UploadServlet Servlet 来上传文件。
    • 上传单个文件,您应该使用单个带有属性 type="file" 的 <input .../> 标签。为了允许多个文件上传,请包含多个 name 属性值不同的 input 标签。输入标签具有不同的名称属性的值。浏览器会为每个 input 标签关联一个浏览按钮。
    •  原理:

       

      html 代码

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <form action="/WEB32/fileuploadServlet2" method="post" enctype="multipart/form-data">
            <input type="text" name="username"><br>
            <input type="file" name="filename"><br>
            <input type="submit" value="上传文件">
        </form>
    </body>
    </html>

     servlet部分代码

    以下是 UploadServlet 的源代码,同于处理文件上传,在这之前我们先确保依赖包已经引入到项目的 WEB-INF/lib 目录下:

    你可以直接下载本站提供的两个依赖包:

    package com.itheima;
    
    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.IOUtils;
    
    public class FileuploadServlet2 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            try {
    
                //1、创建磁盘文件项工厂
                //作用:设置缓存文件的大小  设置临时文件存储的位置
                String path_temp = this.getServletContext().getRealPath("temp");
                //DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024, new File(path_temp));
                DiskFileItemFactory factory = new DiskFileItemFactory();
                factory.setSizeThreshold(1024*1024);
                factory.setRepository(new File(path_temp));
                //2、创建文件上传的核心类
                ServletFileUpload upload = new ServletFileUpload(factory);
                //设置上传文件的名称的编码
                upload.setHeaderEncoding("UTF-8");
    
                //ServletFileUpload的API
                boolean multipartContent = upload.isMultipartContent(request);//判断表单是否是文件上传的表单
                if(multipartContent){
                    //是文件上传的表单
                    //***解析request获得文件项集合
                    List<FileItem> parseRequest = upload.parseRequest(request);
                    if(parseRequest!=null){
                        for(FileItem item : parseRequest){
                            //判断是不是一个普通表单项
                            boolean formField = item.isFormField();
                            if(formField){
                                //username=zhangsan
                                String fieldName = item.getFieldName();
                                String fieldValue = item.getString("UTF-8");//对普通表单项的内容进行编码
                                
                                System.out.println(fieldName+"----"+fieldValue);
                                
                                //当表单是enctype="multipart/form-data"时 request.getParameter相关的方法
                                //String parameter = request.getParameter("username");
                                
                            }else{
                                //文件上传项
                                //文件的名
                                String fileName = item.getName();
                                //获得上传文件的内容
                                InputStream in = item.getInputStream();
                                String path_store = this.getServletContext().getRealPath("upload");
                                OutputStream out = new FileOutputStream(path_store+"/"+fileName);
                                IOUtils.copy(in, out);
                                in.close();
                                out.close();
                                
                                //删除临时文件
                                item.delete();
                                
                            }
                        }
                    }
    
                }else{
                    //不是文件上传表单
                    //使用原始的表单数据的获得方式 request.getParameter();
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
    
    
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }

    web.xml

    <servlet>
        <description></description>
        <display-name>FileuploadServlet2</display-name>
        <servlet-name>FileuploadServlet2</servlet-name>
        <servlet-class>com.itheima.FileuploadServlet2</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>FileuploadServlet2</servlet-name>
        <url-pattern>/fileuploadServlet2</url-pattern>
      </servlet-mapping>

  • 相关阅读:
    socket选项设置
    shell 备忘录
    VIM中cscope和tags数据库的添加
    MFC程序设计中的BeginPaint/EndPaint和GetDC/ReleaseDC的使用
    shell 命令行参数解析
    do{...}while(0)用法总结
    0长度数组的使用
    在线帮助文档
    GCC编译器帮助文档
    几款优秀的Linux基准测试工具
  • 原文地址:https://www.cnblogs.com/qinning/p/9979637.html
Copyright © 2011-2022 走看看