servlet3.0新特性之文件上传&common-fileupload

    Java web开发中文件上传是比较常用的功能,例如论坛注册的时候上传几K的图片作为头像。前段时间信手翻了翻架子上的书,看到servlet3.0新特性当中有对文件上传功能的支持,随便写写servlet 3.0当中的Part和common-fileupload的ServletFileUpload。

    html的<input type = "file" ...>标签表示文件域,可以在页面上产生一个文本框和一个文件选择按钮,要实现文件上传功能,该标签需要配置enctype属性,通常的配置是:<form method = "post" action = "#" enctype = "multipart/form-data"></form>

    再来说说Part,每一个Part对象对应着一个文件上传域,Part对象提供了许多访问上传文件属性的方法,并提供write(String file)方法用于把上传的文件写入服务器硬盘。

    可以在web.xml中通过<multipart-config>对上传参数进行配置,servlet配置:

    

<servlet>
  <servlet-name>uploadFile</servlet-name>
  <servlet-class>test.testFileUpload.com.UploadFileAction</servlet-class>
  <multipart-config>
    <max-file-size>1024000</max-file-size>
  </multipart-config>
</servlet>



    Part对象通过request对象获取文件上传域,通过write(String path)方法把文件写入到指定路径。上传action部分代码:


    

public void doServices(HttpServletRequest request, HttpServletResponse response) throws IOException{
	Part part = null ;
	try {
		part = request.getPart("uploadFile");
	} catch (IllegalStateException | ServletException e) {
		e.printStackTrace();
	}
	
	String fileName = request.getParameter("fileName");
	String path = getServletContext().getRealPath("/uploadFiles")+"/"+fileName;
	part.write(path);
}



    然后再说说ServletFileUpload,common-fileupload需要和common-io配套使用,通常通需要通过DiskFileItemFactory设置上传文件临时存储路径、文件存储路径、上传文件大小限制等,通过ServletFileUpload对象的parseRequest方法获取FileItem对象列表,然后遍历列表获取form上传域。文件上传Action代码如下:


public void doServices(HttpServletRequest request, HttpServletResponse response){
   DiskFileItemFactory factory = new DiskFileItemFactory();
   String tmpPath = getServletContext().getRealPath("/uploadFilesTmp")+"/";//临时路径
   String path = getServletContext().getRealPath("/uploadFiles")+"/";//文件存储路径
   factory.setRepository(new File(tmpPath));
   factory.setSizeThreshold(1024*1024); //缓冲区大小


   ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
   servletFileUpload.setFileSizeMax(-1);//设置上传文件大小

   try {
     List<FileItem> fileItemList = servletFileUpload.parseRequest(request);
 
     for(FileItem fileItem : fileItemList){
       if((!fileItem.isFormField())&&(fileItem.getSize()>0)){
         String clientPath = fileItem.getName();
         clientPath.replaceAll("\\\\", "/");
         String clientFileName = clientPath.substring(clientPath.lastIndexOf("/")+1);
         System.out.println(clientFileName);
         File storeInServerFile = new File(path+"temp");
 
         fileItem.write(storeInServerFile);
       }else{}
     }
   } catch (FileUploadException e) {
     e.printStackTrace();
   } catch (Exception e) {
     e.printStackTrace();
   }
}


你可能感兴趣的:(文件上传)