form表单文件上传三要素:
【post提交、type="file"enctype="multipart/form-data"】
a.method="post"
b.必须有上传组件 <inputtype="file"/>【显示文件上传浏览的入口】
c.必须是上传表单 <form enctype="multipart/form-data">【多部件:将整个表单进行了一个拆分操作,以写的表单输入项;区分普通项和文件上传项】
enctype两种属性的区别:
区别一:
默认的是:
application/x-www-form-urlencoded
:它只上传名字,不带内容
multipart/form-data :带内容。
区别二、
application/x-www-form-urlencoded
:获取的数据是一个整体
(
字符串
)
,
request.getParameter();//
返回值是一个
String
multipart/form-data:它是一个多部件的类型(字节的)
文件上传使用工具:
文件上传需要导入2个jar包
(commons-fileupload-1.2.1.jar和commons-io-1.4.jar)
a.创建磁盘文件工厂(DiskFileItemFactory)
b.创建上传组件核心类(ServletFileUpload)用来解析request的字节流
c.用核心类解析request的字节流(把字节流分隔并封装成了多个对象,一个对象封装着一个表单输入项的信息)
//1.创建磁盘文件工厂(DiskFileItemFactory)
DiskFileItemFactory factory = new DiskFileItemFactory();
//2.创建上传组件核心类(ServletFileUpload)用来解析request的字节流
ServletFileUpload upload = new ServletFileUpload(factory);
//3.用核心类解析request的字节流(把字节流分隔并封装成了多个对象,一个对象封装着一个表单输入项的信息)
List<FileItem> list = upload.parseRequest(request);
FileItem:
isFormField();返回boolean。 普通表单项:true 上传表单项:false
普通表单项type!="file"
上传表单项type="file"
getFieldName();返回String,返回的是表单输入项name属性
getString(Stringencoding); 返回String,只返回普通表单项的参数值
encoding是编码,例如:fi.getString("utf-8");
getInputStream();返回的是inputStream,只返回上传项的文件内容
delete(); 会删除上传产生的临时文件。
getName(); 返回值是String,返回的是上传组件的 文件名
火狐浏览器 文件名是 文件名.扩展名
IE和一部分的浏览器 文件名是 绝对路径+文件名.扩展名
//0.将获取所有的数据保存到一个Map中
Map<String,Object> map = newHashMap<>();
//1.创建磁盘文件工厂(DiskFileItemFactory)
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置缓存大小,如果文件的大小超过了缓冲区的大小,就会产生临时文件
//factory.setSizeThreshold(10*1024*1024);
//2.创建上传组件核心类(ServletFileUpload)用来解析request的字节流
ServletFileUpload upload = new ServletFileUpload(factory);
//解决中文文件名上传编码问题
upload.setHeaderEncoding("utf-8");
//3.用核心类解析request的字节流(把字节流分隔并封装成了多个对象,一个对象封装着一个表单输入项的信息)
List<FileItem> list =upload.parseRequest(request);
//System.out.println(list.size());
String fileName = null;
//4.遍历
for (FileItem fileItem : list) {
if(fileItem.isFormField()){
//普通
map.put(fileItem.getFieldName(),fileItem.getString("utf-8"));
}else{
//上传项
//6.获得文件要上传的路径
String realPath =request.getServletContext().getRealPath("/user/info");
System.out.println(realPath);
//7.获得要上传文件的名字
fileName = fileItem.getName();
System.out.println(fileName);//1.jpg
//8.获得文件的输入流
InputStream inputStream =fileItem.getInputStream();
//9.获得输出流
OutputStream outputStream= new FileOutputStream(realPath+"/"+fileName);
//10.流对拷
IOUtils.copy(inputStream,outputStream);
//11.关闭流资源
inputStream.close();
outputStream.close();
// BeanUtils.populate(user,map);