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

    一 、简单介绍
         使用最为广泛的Java文件上传组件,Struts本身采用这个包来处理文件上传。其基本原理
     FileUpload组件将页面提交的所有元素(普通form表单域,如text和文件域file)都看作一样的FileItem,这样上传页面提交的 request请求也就是一个FileItem的有序组合,FileUpload组件可以解析该request,并返回一个一个的FileItem。而对 每一个FileItem,FileUpload组件可以判断出它是普通form表单域还是文件file域,从而根据不同的类型,采取不同的操作--如果是 表单域,就读出其值,如果是文件域,就保存文件到服务器硬盘上或者内存中。

    二、介绍下
     commons-FileUpload上传过程
      首先要引入的.jar文件:
        commons-fileupload-1.2.1.jar
        commons-io-1.2.jar(此两个文件可以到官网:http://commons.apache.org/ (里面还会有帮助文档API)  下载)
       其次值得注意的是,凡是要上载文件的表单都必须设置enctype属性,且属性的值必须是multipart/form-data,同时请求方法必须是POST!!!!

    1、检测request中是否包含有multipart内容(isMultipartContent(request)是它的一个静态方法)

    ServletFileUpload.isMultipartContent(request)

     

    2、如果有,生成DiskFileItemFactory工厂将进行相关的设置(不知道的情况下也可以不设置)

             DiskFileItemFactory factory = new DiskFileItemFactory();
            // maximum size that will be stored in memory
            factory.setSizeThreshold(
    4096);// 设置缓冲区大小,这里是4kb 
            // Location to save data that is larger than maxMemSize.
            factory.setRepository(new File("d:/"));// 设置临时目录 

            factory.setHeaderEncoding("UTF-8");//设置字符集 防止中文文件名乱码

    3、生成上传ServletFileUpload类,并将DiskFileFactory工厂传给它,并对ServletFileUpload进行配置

           // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            upload.setFileSizeMax(3*1024*1024);//设置上传文件大小3M
            upload.setSizeMax(6*1024*1024);//设置请求总文件大小6M

    4、从request得到上传的文件列表,并获得其迭代器

                // Parse the request to get file items.
                List<FileItem> fileItems = upload.parseRequest(request);

                // Process the uploaded file items
                Iterator i = fileItems.iterator();

    5、处理文件:写入或者其他操作

    while (i.hasNext()) {
                    FileItem fi = (FileItem) i.next();
                    if (fi.isFormField()) {//当是表单域时,进行的处理
                        // Get the uploaded file parameters
                        String fieldName = fi.getFieldName();//得到元素的name属性的值

                       String fieldValue=fi.getString("utf-8");//得到元素的value的值
                        String fileName = fi.getName();//这里是表单域,所以得到的是null
                       
                      
                        } else {//当是文件域时,将文件保存到硬盘中

                          String basePath = request.getRealPath("/upload");

                          String contentType = fi.getContentType();
                          boolean isInMemory = fi.isInMemory();
                          long sizeInBytes = fi.getSize();

                         String fieldName = fi.getFieldName();//得到元素的name属

                          String fileName = fi.getName();//取得上传的文件名
                            file = new File(basePath+"/"+filename);

                           fi.write(file);
                        }
                       
                        out.println("Uploaded Filename: " + fileName + "<br>");
                    }
                }

    }

     

    说明:

    FileItem接口是对用户上传文件的封装

    DiskFileItemFactory 实现了FileItemFactory接口,主要方法有public FileItem createItem(String fieldName, String contentType, boolean isFormField, String fileName)

    ServletFileUpload从FileUpload继承,而FileUpload又从FileUploadBase继承,功能:分析传入的request对象、得到文件列表FileItemIterator……

     

  • 相关阅读:
    Linux学习32
    Linux学习31-如何查看 linux 系统是centos还是ubuntu,并查看系统版本号
    python测试开发django-124.bootstrap点删除按钮弹确认删除
    python测试开发django-123.bootstrap模态框(modal)垂直居中显示
    python测试开发django-122.bootstrap模态框(modal)学习
    Linux下查询tomcat进程命令
    linux服务器通过X11实现图形化界面显示 1 背景描述
    linux(centos)配置ipv6网卡
    linux 下给网卡添加ipv6、路由
    2021年最新大厂php+go面试题集(1)
  • 原文地址:https://www.cnblogs.com/zlzlzl1993/p/3424126.html
Copyright © 2011-2022 走看看