文件上传技术入门
文件上传要满足:
1.表单必须用post
2.上传的数据,标签中必须用name
3.表单必须是多部分表单 enctype=”multipart/form-data”
服务器端如何获得上传的文件?
1.通过request获得请求体内容
2.解析请求体:
根据分隔符将请求体的文本内容分割成数组,数组中每一部分是一个表单项
3.遍历数组
4.取出普通表单项:eg: username=zhangsan
5.文件上传表单项:
filename=”aaa.text”
文件内容
使用io将文件内容以文件名存到服务器上
具体步骤
导包:
commons-fileupload-1.2.1
commons-io-1.4
通过servlet接收文件
//1.创建磁盘文件工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //2.创建文件上传的核心类 ServletFileUpload upload = new ServletFileUpload(factory); //3.解析request 获得文件项集合 List<FileItem> parseRequest = upload.parseRequest(request); //4.遍历文件项集合 for(FileItem item : parseRequest ){ //5.判断是否是表单项 boolean formField = item.isFormField(); if(!formField){ //获得上传文件名称 String fileName = item.getName(); //获得上传文件内容 InputStream in = item.getInputStream(); //将in中的数据存储到服务器 String path = this.getServletContext().getRealPath("upload"); OutputStream out = new FileOutputStream(path+"/"+fileName); int len = 0; byte[] buffer = new byte[1024]; while((len=in.read(buffer))>0){ out.write(buffer,0,len); } in.close(); out.close(); } else{ String filedName = item.getFiledName(); String filedValue = item.getString(); } }
(有异常需要try catch)
加强:
1.创建磁盘文件项工厂时可以设置临时文件的大小和位置
1)DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024,new File());
2)factory.setRepository(new File());
factory.setSizeThreshold(1024*1024);
2.文件上传核心类API
1)设置文件上传的名称的编码
upload.setHeaderEncoding(“UTF-8”);
2)判断表单是否是文件上传表单
boolean multipartContent = upload.isMultipartContext(request);
3.解析request获得文件项集合 非空判断后遍历
普通表单项
String filedName = item.getFiledName();
item.getString(“UTF-8”) //对普通表单项内容编码
注意!当表单是文件上传表单时 request.getParameter相关方法失效
文件上传表单项
String fileName = item.getName();
InputStream in = item.getInputStream();
String path = this.getServletContext().getRealPath(“upload”);
OutputStream out = new FileOutputStream(path+”/”+fileName);
IOUtils.copy(in,out);
in.close();
out.close();
//删除临时文件
item.delete();