1、导包
核心类:
DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个具类。
ServletFileUpload - 文件上传的核心类,此类接收request,并解析reqeust。
2、设置表单为post,且enctype为multipart/form-data,传递的是字节码
//req.getParameter("txt");//返回的是null
1
3、Demo /Upload
1 request.setCharacterEncoding("utf-8"); 2 //获取项目的绝对地址 3 String filepath= getServletContext().getRealPath("/file"); 4 String fileTemp=getServletContext().getRealPath("/temp"); 5 //1、声明工厂类,用于在指定磁盘上设置一个临时目录 6 /* 7 * 第一个参数:sizeThreadHold - 设置缓存(内存)保存多少字节数据,默认为10K 8 * 如果一个文件没有大于10K,则直接使用内存直接保存成文件就可以了。 9 * 如果一个文件大于10K,就需要将文件先保存到临时目录中去。10 * 第二个参数 File 是指临时目录位置11 * 或者无参函数12 * disk.setSizeThreshold(sizeThreshold);13 * disk.setRepository(repository)14 * */15 DiskFileItemFactory disk=new DiskFileItemFactory(1024*10, new File(fileTemp));16 //2、声明,接收上面的临时目录17 ServletFileUpload upload=new ServletFileUpload(disk);18 //3、解析request19 try {20 //存储文件信息21 List
如果form表单中有说明,由于表单的enctype在上传文件时必须设为multipart/form-data,这样的话req.getParameter("txt");//返回的是null
我们可以通过item.isFormFielda(),进行判断,分类提取内容
1 if(item.isFormField())//如果是text|checkbox|radio|select这个值就是true.2 {3 String fileName= item.getFieldName();//获取的是文本框的name值4 String value= item.getString("utf-8");//获取的是文本框的value值5 System.out.println(fileName+"=="+value);6 }7else { //保存文件 }
在上面有提到,保存文件时,如果文件较大,需要先保存为缓存,在写入到文件中保存,这里可以使用迭代器,提高性能,加快保存速度。
但是这种方法也是有缺点的,由于交换可以在内存中进行,或者使用tomcat的内存分区,所以会比较的占用内存
Demo:
1 String filePath=getServletContext().getRealPath("/file"); 2 DiskFileItemFactory disk=new DiskFileItemFactory(); 3 disk.setRepository(new File(getServletContext().getRealPath("/temp"))); 4 try{ 5 ServletFileUpload up=new ServletFileUpload(disk); 6 FileItemIterator it= up.getItemIterator(request);//返回迭代器 7 while(it.hasNext()){ 8 FileItemStream itemStream= it.next(); 9 String fileName= itemStream.getName();10 fileName=fileName.substring(fileName.lastIndexOf("\\")+1);11 InputStream in= itemStream.openStream();12 FileUtils.copyInputStreamToFile(in, new File(filePath+"/"+fileName));13 14 }
我们知道,在上传的时候有些需要设置上传文件的大小,我们可以设置全部文件大小上传限制,或者设置单个文件的大小
1 ServletFileUpload up=new ServletFileUpload(disk);2 //up.setSizeMax(1024*1024*100);//设置同时上传文件的总大小100M3 //up.setFileSizeMax(1024*1024*10);//设置每一个文件的最大值10M
这里两个限制大小一般情况下不用同时限制