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()方法,可以完成文件的上传以及将普通文本域内的信息利用反射封装到对应的实体类中