利用commons-fileupload在servlet中实现文件上传

commons-fileupload.jar这个组件来自阿帕奇,可方便的实现文件的上传,(要有commons-io.jar的支持)

commons-fileupload这个组件主要有三个经常用到的类,一个是DiskFileItemFactory,的作用主要是用来设置缓存和临时文件目录,因为文件大小不同,当上传的文件项目比较小时,直接保存在内存中(速度比较快),比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,但是内存资源是有限的)。它可以设置将文件保存在内存还是磁盘上的临界值,也可以设置最大可上传的临界值,以及临时目录的具体路径

FileItem类

这是一个接口,主要用来对具体的上传列表内容。

boolean isFormField()用来判断是否是普通文本表单还是文件表单。

String getName()用来返回该文件的名称,这个名字包括路径

void write(FIle file)用于将该文件写到某个具体文件路径里。

还有一些具体的方法通过名字就可以知道具体的功能。

ServletFileUpload类

ServletFileUpload类是Apache文件上传组件处理文件上传的核心高级类(所谓高级就是不需要管底层实现,暴露给用户的简单易用的接口),主要用到parseRequest(HttpServletRequest)返回一个list<FileItem>,具体使用FileItem来进行具体的上传操作。

主要的上传代码:

DiskFileItemFactory factory = new DiskFileItemFactory();
		      factory.setSizeThreshold(5*1024); //最大缓存  
		      factory.setRepository(new File(serverPath+tempPath));//临时文件目录  
		      ServletFileUpload upload = new ServletFileUpload(factory);
		      upload.setSizeMax(sizeMax*1024*1024);//文件最大上限  

String filePath = null;  
		      try {  
		          List<FileItem> items = upload.parseRequest(request);//获取所有文件列表  
		          for (FileItem item : items) {  
		              //获得文件名,这个文件名包括路径  
		              if(!item.isFormField()){  
		                  //文件名  
		                  String fileName = item.getName().toLowerCase();  
		                    
		                  if(fileName.endsWith(fileType[0])||fileName.endsWith(fileType[1])||fileName.endsWith(fileType[2])||fileName.endsWith(fileType[3])||fileName.endsWith(fileType[4])||fileName.endsWith(fileType[5])){  
		                      String uuid = UUID.randomUUID().toString();  
		                      filePath = serverPath+uploadPath+uuid+fileName.substring(fileName.lastIndexOf("."));  
		                      item.write(new File(filePath));  
		                      PrintWriter pw = response.getWriter();  
		                      String returnvalue= uploadPath+uuid+fileName.substring(fileName.lastIndexOf("."));
		                      pw.write("<script>alert('"+returnvalue+"');window.returnValue='"+returnvalue+"';window.close();</script>");  
		                      pw.flush();  
		                      pw.close();  
		                  }else{  
		                      request.setAttribute("errorMsg", "上传失败,请确认上传的文件存在并且类型是图片!");  
		                      request.getRequestDispatcher("index.jsp").forward(request,  
		                              response);  
		                  }  
		              }  
		          }  
		      } catch (Exception e) {  
		          e.printStackTrace();  
		          request.setAttribute("errorMsg", "上传失败,请确认上传的文件大小不能超过"+sizeMax+"M");  
		          request.getRequestDispatcher("index.jsp").forward(request,  
		                  response);  
		      }  
		}
		else
		{
			PrintWriter out = response.getWriter();
			
			out.write("<script>alert('the type of request does not match')</script>");
		}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值