文件上传知识点
文件上传要素
1.表单的提交方式必须是post
2.表单中需要元素,需要有name属性和值
3.表单enctype=“enctype=multipart/form-data”
DiskFileItemFactory:磁盘文件项工厂
构造方法
方法 | 说明 |
---|---|
DiskFileItemFactory() | 无参构造方法 |
DiskFileItemFactory(int SizeThreshold,Java.io.File repository) | 有参构造方法 |
- SizeThreshold:设置文件上传的缓冲区大小,默认值为10kb
- Repository:设置文件上传过程中产生临时文件存放的路径
常用方法
方法 | 说明 |
---|---|
setSizeThreshold() | 设置缓冲区的大小 |
setReponstory() | 设置临时文件存放的路径 |
使用方法(代码碎片)
//1.创建磁盘文件项工厂
DiskFileFactory diskFileFactory = new DiskFileFactory();
//2.设置缓冲区的大小
diskFileFactory.setSizeThreshold(3*1024*1024);//设置缓冲区的大小为3M
//3.设置临时文件存放的路径
//获得临时文件存放的路径
String tempPath=request.getServletContext().getRealPath("/temp");
diskFileItemFactory.setRepository(new File(tempPath));
ServletFileUpload:核心解析类
构造方法
方法 | 说明 |
---|---|
ServletFileUpload() | 无参构造方法 |
ServletFileUpload(FileItemFactory fileItemFactory) | 有参构造方法 |
- FileItemFactory :磁盘文件项工厂
常用方法
方法 | 说明 |
---|---|
isMultipartContent(javax.Servlet.http.HttpServletRequest request) | (静态方法)判断表单的enctype属性是否正确 |
parseRequest(javax.Servlet.http.HttpServletRequest request) | 解析Request对象,返回一个list集合(每一个部分的对象FileItem) |
setFileSizeMax(long fileSizeMax) | 设置单个文件的大小 |
setSizeMax(long sizeMax) | 设置上传文件的总大小 |
setHeaderEncoding(java.lang.String encoding) | 设置中文文件名上传乱码问题 |
setProgressListener(ProgressListener PListener) | 设置监听文件上传的进度问题 |
使用方法(代码碎片)
isMultipartContent使用
//判断表单的enctype属性:
boolean flag=ServletFileUpload.isMultipartContent(request);
//判断enctype属性是否是multipart/form-data
if(!flag){
//enctype属性不是multipart/form-data
request.setAttribute("msg", "表单的格式不正确!");
//转发至web前端
request.getRequestDispatcher("upload.jsp").forward(request, response);
return;
}
个人思路:判断不是正确的enctype属性,则不执行后面的代码
parseRequest使用
//创建一个核心的解析类
ServletFileUpload fileUpload=new ServletFileUpload(diskFileItemFactory);
//利用核心类解析Request,解析后会得到多个部分。返回一个list集合。List集合装的每个部分的内容(FileItem文件项)。
List<FileItem>list=fileUpload.parseRequest(request);
setSizeMax/setFileSizeMax使用
//创建一个核心的解析类
ServletFileUpload fileUpload=new ServletFileUpload(diskFileItemFactory);
//设置文件上传不可超过5m
fileUpload.setSizeMax(5*1024*1024);
两个方法使用方式是一致的,注意区分单个文件和总文件即可
FileItem:文件项
方法
isFormField():判断表单项是普通项还是文件上传项。如果为true代表普通项
普通项的方法
getFileldName():获得普通项的名称
getString():获得普通项的值
getString(java.lang.String.encoding):获得普通项的值
文件上传项的方法
getNmae():获得文件名方法
getInputStream():获得文件上传的文件内容的方法
getSize():获得文件上传的文件大小
delete():删除文件上传过程中的临时文件
FileItem使用(案例完整代码)
//判断表单的enctype属性:
boolean flag=ServletFileUpload.isMultipartContent(request);
if(!flag) {
//enctype属性不是multipart/form-data
System.out.println("表单的格式不正确!");
request.setAttribute("msg", "表单的格式不正确!");
request.getRequestDispatcher("upload.jsp").forward(request, response);
return;
}
//1.创建磁盘文件项工厂
DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory();
//1.1设置缓冲区的大小:
diskFileItemFactory.setSizeThreshold(3*1024*1024); //设置缓冲区的大小为3M
//1.2设置临时文件存放的路径:
//获得临时文件存放的路径:
String tempPath=request.getServletContext().getRealPath("/temp");
diskFileItemFactory.setRepository(new File(tempPath));
//2.创建一个核心的解析类
ServletFileUpload fileUpload=new ServletFileUpload(diskFileItemFactory);
//设置文件上传大小:
fileUpload.setSizeMax(5*1024*1024);//设置文件上传大小不超过5m
//3.利用核心类解析Request,解析后会得到多个部分。返回一个List集合。List集合装的每个部分的内容(FileItem文件项)。
try {
List<FileItem>list= fileUpload.parseRequest(request);
//4.遍历List集合,会得到代表每个部分的文件项的对象。根据文件项判断是文件上传项
for(FileItem fileItem:list) {
//判断这个文件项是普通项还是文件上传项。
if(fileItem.isFormField()) {
//普通项:
//接受普通项的值:(接收值不能再使用request.getParameter())
String name=fileItem.getFieldName();//获得普通项的名称
//获得普通项的值
String value=fileItem.getString("UTF-8");
System.out.println(name+" "+value);
}else {
//文件上传项:
//获得文件上传项的文件的名称:
String filename=fileItem.getName();
int idx=filename.lastIndexOf("//");
if(idx!=-1) {
//使用老版本浏览器:
filename.substring(idx+1);
}
//获得文件上传的文件的数据:
InputStream is=fileItem.getInputStream();
//获得文件上传的路径:磁盘绝对路径。
String realPath=request.getServletContext().getRealPath("/upload");
//创建一个输出流,写入到设置的路径中
OutputStream os=new FileOutputStream(realPath+"/"+filename);
//两个流对接:
int len=0;
byte[] b=new byte[1024];
while((len=is.read(b))!=-1) {
os.write(b,0,len);
}
is.close();
os.close();
}
//删除临时文件
fileItem.delete();
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
文件上传兼容浏览器问题及解决
问题描述:如果使用IE老版本的浏览器出现一个名称获取错误额度问题。IE老版本获取文件名称的时候会带有路径
问题解决:
//文件上传项:
//获得文件上传项的文件的名称:
String filename=fileItem.getName();
int idx=filename.lastIndexOf("//");
if(idx!=-1) {
//使用老版本浏览器:
filename.substring(idx+1);
}