jsp+servlet文件上传以及request提交数据利用反射封装到实力类中

1.带有文件上传的form表单不能使用getParameter()及其相关方法获取参数

之前用过使用反射将数据填充到实体类中使用反射将数据映射到实体类中,但是此种方法不支持上传文件
但是后来发现这种方法并不支持文件上传,因为文件上传的enctype是:”multipart/form-data”,想要了解enctype,请点击这里,使用mutltipart/form-data这种数据编码方式,其会将数据放到请求正文中(带有二进制字节,(上传的文件)),此时使用getParameter()获取普通文本信息是获取不到的。
可以使用request.getInputStream()获取其二进制字节,将其解析,可以得到表单文本域以及上传文件对应的信息
自己也手动写了一个解析request.getInputStream()的方法,也可以实现上传图片等。
若有兴趣,请点击这里

最后,还是采用了commons提供的jar包,毕竟人家的才是正规的,自己手动写纯粹是为了研究,加深印象。

2.支持上传文件功能:
声明:文件的上传,参考自这里
另外还需要添加commons-fileupload.jar,commons-beanuitls.jar等

public void setParameter(String fieldName,String fieldValue) throws Exception{
            //使用this关键字是因为,将该方法封装到了实体类中
            Field field = this.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            //如果当前类型是java.util.Date则不适用ConvertUtils转换
            Object obj = null;
            if(field.getType().isAssignableFrom(Date.class)){
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                obj = sdf.parse(fieldValue);
            }else{
                obj = ConvertUtils.convert(fieldValue, field.getType());
            }
            field.set(this, obj);
        }
        public void fileUpload(HttpServletRequest request) throws Exception {
            ///为解析类提供配置信息,文件大小等配置
            DiskFileItemFactory dff = new DiskFileItemFactory();
            //创建解析类的实例
            ServletFileUpload sfu = new ServletFileUpload(dff);
            sfu.setFileSizeMax(1024 * 1024); //文件最大为1M
            //将表单域中的所有对象都封装到List<FileItem>中去
            List<FileItem> fileItems = sfu.parseRequest(request);
            for (FileItem fileItem : fileItems) {
                //对应表单域标签的name属性
                String fieldName = fileItem.getFieldName();
                //若表单域是文件类型
                if (!fileItem.isFormField()) {
                    //获得上传的文件名
                    String fileName = fileItem.getName();
                    if (fileName != null && !"".equals(fileName)) {
                        //TODO
                        String filePath = request.getSession().getServletContext().getRealPath("/");
                        String savePath = "/uploadImages/" + fileName;
                        fileItem.write(new File(filePath+savePath));
                        //将图片url赋给对应的成员变量
                        this.setParameter(fieldName, savePath);
                    } else {
                        System.out.println(fieldName + " has no img to upload");
                    }
                    //表单域是普通类型
                } else {
                    //将其映射到
                    String fieldValue = fileItem.getString("utf-8");
                    this.setParameter(fieldName, fieldValue);
                }
            }

        }

调用fileUpload()方法,可以完成文件的上传以及将普通文本域内的信息利用反射封装到对应的实体类中

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值