文件上传技术入门

文件上传要满足:

  1.表单必须用post

  2.上传的数据,标签中必须用name

  3.表单必须是多部分表单 enctype="multipart/form-data"

服务器端如何获得上传的文件?

  1.通过request获得请求体内容

  2.解析请求体:

    根据分隔符将请求体的文本内容分割成数组,数组中每一部分是一个表单项

  3.遍历数组

  4.取出普通表单项:eg: username=zhangsan

  5.文件上传表单项:

    filename="aaa.text"

    文件内容

    使用io将文件内容以文件名存到服务器上

具体步骤

  导包:

    commons-fileupload-1.2.1

    commons-io-1.4

  通过servlet接收文件

    //1.创建磁盘文件工厂

    DiskFileItemFactory factory = new DiskFileItemFactory();

    //2.创建文件上传的核心类

    ServletFileUpload upload = new ServletFileUpload(factory);

    //3.解析request  获得文件项集合

    List<FileItem> parseRequest = upload.parseRequest(request);

    //4.遍历文件项集合

    for(FileItem item : parseRequest ){

      //5.判断是否是表单项

      boolean formField = item.isFormField();

      if(!formField){

        //获得上传文件名称

        String fileName = item.getName();

        //获得上传文件内容

        InputStream in = item.getInputStream();

        //将in中的数据存储到服务器

        String path = this.getServletContext().getRealPath("upload");

        OutputStream out = new FileOutputStream(path+"/"+fileName);

        int len = 0;

        byte[] buffer = new byte[1024];

        while((len=in.read(buffer))>0){

          out.write(buffer,0,len);

        }

        in.close();

        out.close();

      } else{

        String filedName = item.getFiledName();

        String filedValue = item.getString();      

      }

    }

(有异常需要try catch)

加强:

  1.创建磁盘文件项工厂时可以设置临时文件的大小和位置

    1)DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024,new File());

    2)factory.setRepository(new File());

       factory.setSizeThreshold(1024*1024);

  2.文件上传核心类API

    1)设置文件上传的名称的编码

      upload.setHeaderEncoding("UTF-8");

    2)判断表单是否是文件上传表单

      boolean multipartContent = upload.isMultipartContext(request);

  3.解析request获得文件项集合 非空判断后遍历

    普通表单项

    String filedName = item.getFiledName();

    item.getString("UTF-8") //对普通表单项内容编码

      注意!当表单是文件上传表单时 request.getParameter相关方法失效

    文件上传表单项

      String fileName = item.getName();

      InputStream in = item.getInputStream();

      String path = this.getServletContext().getRealPath("upload");

      OutputStream out = new FileOutputStream(path+"/"+fileName);

      IOUtils.copy(in,out);

      in.close();

      out.close();

      //删除临时文件

      item.delete();

猜你喜欢

转载自www.cnblogs.com/xiongdaren/p/9379524.html