`
bobshute
  • 浏览: 279810 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

fileupload渗透分析(org.apache.commons.fileupload渗透分析)

    博客分类:
  • j2se
阅读更多
fileupload渗透分析(org.apache.commons.fileupload渗透分析)

 

 

 

 

package com.zy.service;   
  
import java.io.File;   
import java.io.IOException;   
import java.io.PrintWriter;   
import java.util.Iterator;   
import java.util.List;   
  
import javax.servlet.ServletException;   
import javax.servlet.http.HttpServlet;   
import javax.servlet.http.HttpServletRequest;   
import javax.servlet.http.HttpServletResponse;   
  
import org.apache.commons.fileupload.FileItem;   
import org.apache.commons.fileupload.FileUploadException;   
import org.apache.commons.fileupload.disk.DiskFileItemFactory;   
import org.apache.commons.fileupload.servlet.ServletFileUpload;   
  
public class UpFileProcessServlet extends HttpServlet {   
  
public void doGet(HttpServletRequest request, HttpServletResponse response)   
    throws ServletException, IOException {   
  
   response.setContentType("text/html");   
   request.setCharacterEncoding("utf-8");   
   this.FileUpCenter(request, response);//调用文件上传中心类   
          
           
      }   
        
     /*文件上传中心类*/  
        private void FileUpCenter(HttpServletRequest request,HttpServletResponse response){   
           /*  
            * 1.处理文件 上传 首先要 创建ServletFileUpload类的实例  
            * */  
            ServletFileUpload upload=new ServletFileUpload();   
            /*  
             * 2.设置整个请求最大值,默认为-1(表示没有上限)  
             * */  
            upload.setSizeMax(-1);   
            /*  
             * 3.设置单个文件的大小 10M 默认为-1(没有上限)  
             * */  
            upload.setFileSizeMax(1024*1024*10);   
            /*  
             * 4.设置上传的临时数据(某一个数据在上传中被保存的数据) 在内存中 的大小  
             * */  
                    //1.创建[文件项目]的工厂_友情提示:如果用DiskFileUpload处理文件上传 可不用创建该工厂          
                      DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory();   
                   //2.设置 内存缓存 默认为(10240)10k 咱们设置为5K   
                       diskFileItemFactory.setSizeThreshold(1024*5);   
                    //3.设置超过缓存部分的 数据 存储目录 该目录默认为:C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\   
                        //咱们设置为当前应用上下文的/upload/temp路径   
                           diskFileItemFactory.setRepository(new File( this.getServletContext().getRealPath("/upload/temp")));   
                       //4.把改工厂设置到upload使其具有以上属性   
                           upload.setFileItemFactory(diskFileItemFactory);   
                /*  
                 * 5.设置监听器 用于监听文件的上传情况(方便结合ajax与进度条 的使用)  
                 * */          
                           //如:upload.setProgressListener(pListener);   
                /*  
                 * 6.解析数据 解析请求中的数据 (主要是创建FileItem)  
                 * */    
                       List fileItems=null;      
                    try {   
                 fileItems=upload.parseRequest(request);   
       /*分析:该方法首先创建了ServletRequestContext的实例  
       *       然后从请求对象中获取了 字符集|编码|请求的总大小|输出流  
       *       然后创建了其内部类FileItemIteratorImpl,  
       *          该类负责检查字符集是否合法|请求总大小是否大于自定义的总大小,  
       *          如果超过会抛一个SizeLimitExceededException异常 等  
       *          这个内部类的主要作用就是对文件数据的一些判断 如name名称 等   
       *       然后经过一些复杂的周折,它会通过请求总大小,nam属性名称,文件名,和是否是file类型来创建FileItem的示例以及通过Streams的copy方法来传递一些输入输出流  
       * */  
        } catch (FileUploadException e) {   
       e.printStackTrace();   
        }   
       /*  
        * 7.一切准备工作做好了,咱们就开始处理每个表单的单个字段(当然如果你就上传一个文件 只有一个表单可以处理 呵呵)  
        * */  
         //1.首先创建一个迭代器Iterator i = fileItems.iterator();   
        Iterator i = fileItems.iterator();   
       //2.迭代 取出每一个FileItem进行分析   
        while (i.hasNext())    
            {   
                FileItem fi = (FileItem) i.next();   
                //3.isFormField方法用于判断FileItem类对象封装的数据是否属于一个普通表单字段,还是属于一个文件表单字段,如果是普通表单字段则返回true,否则返回false。   
                if (!fi.isFormField())//取反    
                {   
                        try    
                        {   
                      //4.通过getName()方法取表单中name属性对应的文件名   
                               //注:只要表单中只要设置了name属性,即便没有上传任何东西 该表单仍然对应一个FileItem对象 只是name为空。所以要对getName() 的值进行非空判断   
                          String pathThatSrc = fi.getName();   
                          if(pathThatSrc.trim().equals(""))   
                          {   
                              continue;   
                          }   
                          int start = pathThatSrc.lastIndexOf(File.separator);//通过"\\"截取索引的下标位置   
                          String fileName = pathThatSrc.substring(start + 1);//把下标位置+1的下标开始截取文件名(再补充一下昂,如果你上传的是中文文件名的文件 最后传到服务器上会变成乱码 也许要修改源码才可以解决)推荐 使用 UUID 来作为文件名称     
                          File bulidFile = new File(this.getServletContext().getRealPath("/upload/filedir"), fileName);//通过目录 和 文件名 创建File对象 你还可以对该File进行存在与否的判断       
                         //5.写入文件   
                          fi.write(bulidFile);   
                          String fieldName = fi.getFieldName();   
                          request.setAttribute(fieldName, fileName);   
                        }   
                     catch (Exception e)    
                     {   
                             e.printStackTrace();   
                             return;   
                     }   
                     finally  
                     {   
                         fi.delete();//无论是否出现异常 都要去清理临时 文件夹 里的数据   
                     }   
         
                }//if end   
  
            }//while end   
  
        }//class end   
  
  
  
public void doPost(HttpServletRequest request, HttpServletResponse response)   
    throws ServletException, IOException {   
             this.doGet(request, response);   
}   
  
}  

 

 

 

原文地址:http://celerity.iteye.com/blog/295528

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics