FileItem 上传,获取上传页面普通表单域的值 详解

commons-fileupload上传,获取上传页面普通表单域的值

今天刚做了个文件上传功能,遇到了一些问题,不过现在都解决了。在这里我想把我知道的和大家分享下,希望对大家有帮助。

       首先,要做文件上传的话就得先下载一个文件上传的组件,我用的是commons-fileupload。当然还有其它的组件,自己喜欢用哪个就用哪个吧。我用的插件:http://liukai135.ys168.com/?jdfwkey=ilrfp,或者到这里面去下载http://commons.apache.org/fileupload/。上传需要下面这两个包:commons-fileupload-1.1.1.jar和commons-io-1.2.jar。把它们放到你工程的lib目录下面就可以使用了。

       然后,写一个方法或类,下面的代码为上传的核心代码块:

   //检查表单是否正确
      boolean isMultipart = FileUpload.isMultipartContent(request);
      DiskFileItemFactory factory = new DiskFileItemFactory();
      ServletFileUpload upload = new ServletFileUpload(factory);
      //文件最大,设为-1表示不受限制
      upload.setSizeMax(4096);
      //解析请求,把解析的结果放在一个List里面
      List items = upload.parseRequest(request);
      //缓存大小,设为-1表示不受限制
      factory.setSizeThreshold(4096);
      //设置临时目录
      factory.setRepository(new File("D:\\temp"));
      Iterator iter = items.iterator();
      while( iter.hasNext() ){
        FileItem item = (FileItem)iter.next();
        //检查是一个普通的表单域还是File组件
        if( !item.isFormField() ){
          System.out.println("FileName:==>"+item.getName());
          System.out.println("FieldName:==>"+item.getFieldName());
          System.out.println("Size:==>"+item.getSize());
          //item.getName 返回的是完整的文件名,如:E:\\xx\11.doc
          //所以这里用一个fullFile来取文件名
          File fullFile = new File(item.getName());
          File uploadedFile = new File("D:\\ftp\\",fullFile.getName());
          item.write(uploadedFile);
        }
      }

注释写的很清楚,我就不多解释了。

其中:item.getName()是得到上传文件的物理路径+文件名。

item.getFieldName()是得到表单域的类型,当item为上传文件表单域时,item.getFieldName() = file(代表文件),当item为普通的表单域时,item.getFieldName() = file(代表文件) 会得到此表单域的属性名,例如:<input id="remk" name="remk" type="text" value="" />,item.getFieldName() = "remk"。

item.getString()得到该表单域的值。例如:<input id="remk" name="remk" type="text" value="dddddddddd" />,item.get.String() = "dddddddddd"。

item.getSize()表示该上传文件或表单域值的大小。

item.isFormField() :判断该item是否为普通表单域。

        看了上面的内容之后,你应该知道怎么或得普通表单域的值了吧,用request.getParameter("remk")肯定不会获得值,因为上传页面的from表单是用二进制流的方式上传的,所以用普通的方法根本得不到它的值的。解决方法如下:

//检查表单是否正确
      boolean isMultipart = FileUpload.isMultipartContent(request);
      DiskFileItemFactory factory = new DiskFileItemFactory();
      ServletFileUpload upload = new ServletFileUpload(factory);
      //文件最大,设为-1表示不受限制
      upload.setSizeMax(4096);
      //解析请求,把解析的结果放在一个List里面
      List items = upload.parseRequest(request);
      //缓存大小,设为-1表示不受限制
      factory.setSizeThreshold(4096);
      //设置临时目录
      factory.setRepository(new File("D:\\temp"));
      Iterator iter = items.iterator();
      while( iter.hasNext() ){
        FileItem item = (FileItem)iter.next();
        //检查是一个普通的表单域还是File组件
        if( !item.isFormField() ){
          System.out.println("FileName:==>"+item.getName());
          System.out.println("FieldName:==>"+item.getFieldName());
          System.out.println("Size:==>"+item.getSize());
          //item.getName 返回的是完整的文件名,如:E:\\xx\11.doc
          //所以这里用一个fullFile来取文件名
          File fullFile = new File(item.getName());
          File uploadedFile = new File("D:\\ftp\\",fullFile.getName());
          item.write(uploadedFile);
       
}else{
            String remk = item.getString();//获得普通表单域的值。
       }

      }

我在这只是考虑有一个文件上传域和一个普通域的情况。如果有多个普通域的话就得:

else{
     if("remk".equals(item.getName()){
     String remk = item.getString();
      }
      if("descript".equals(item.getName()){
String descript = item.getString();
      }
}

这样得到的值,如果有汉字的话就会有乱码。所以要转一下编码:

String remk = new String(item.getString().getBytes("iso-8859-1"),"UTF-8");

这样的话就不会有什么问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值