javaWeb文件上传知识点

文件上传知识点

  • 文件上传要素
  • DiskFileItemFactory:磁盘文件项工厂
    • 构造方法
    • 常用方法
      • 使用方法(代码碎片)
  • ServletFileUpload:核心解析类
    • 构造方法
    • 常用方法
      • 使用方法(代码碎片)
        • isMultipartContent使用
        • parseRequest使用
        • setSizeMax/setFileSizeMax使用
  • FileItem:文件项
    • 方法
    • 普通项的方法
    • 文件上传项的方法
    • FileItem使用(案例完整代码)
  • 文件上传兼容浏览器问题及解决

文件上传要素

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);
}

你可能感兴趣的:(java,html)