fileUpload控件使用方法介绍(有试例源代码哦!)

来源:互联网 发布:淘宝一件衣服不同价格 编辑:程序博客网 时间:2024/06/05 18:48
 
使用FileUpLoad包进行文件上传。
进行文件上传一般有三种方式
使用fileUpLoad
使用smartFileUpLoad
自己编写类似的程序进行解析
下面介绍一下第一种方式的使用方法:
fileUpLoad是apache的一个开源项目,用来进行解析带有文件的请求处理。著名的struts的FormFile就是用的它进行解析处理的。
 
 
1首先页面上我们需要将表单设置下面类似的参数:
< form method="post" enctype="multipart/form-data" action=”………… ” >
2 然后我们需要在工程里导入所需要的包,可以在apache网站上下载:
http://jakarta.apache.org/commons/fileupload/
3 在我们的servlet中可以获取到request参数,然后可以这样取传递过来的字段参数及文件参数:
在这里我写了两个类去生成并存储字段和文件的值:
可以跟着红色的注释代码看一下实现的过程
/**
 *@authorsxy
 *
 *封装了FileUpload类,实现文件上传功能
 *
 */
publicclass FileUploadUtil {
    privatestatic Logger logger = Logger.getLogger(FileUploadUtil.class);
    public HttpServletRequest request;
    //这个是FileUpLoad控件的实际处理的request数据的类对象
    DiskFileUpload fu;
//用来存储解析后的字段和文件数据
    List fileItems;
   
    //字段名与字段值的映射 String--Vector
    HashMap fieldsMap=new HashMap();
   //字段名与相对UploadedFile的映射
    HashMap filesMap=new HashMap();
   
   
   
    /**构造函数,遍历所有字段,分别存入文件MAP和字段MAP
     *@paramrequest
     *@paramtempDirectory
     *@throwsBaseWebException
     */
    //当生成一个类时就开始了对request传递过来的数据的解析
 
    public FileUploadUtil(HttpServletRequest request,String tempDirectory) throws Exception {
       
        this.request = request;
        //这一句很重要,以前我没有加上,结果UTF-8编码时老是出现乱码问题,最后还是看了Struts的文件上传源代码是这样写的,才解决了乱码问题
String encoding=request.getCharacterEncoding();
        fu = new DiskFileUpload();
        fu.setSizeMax(44194304);                 //设置文件大小.
        fu.setSizeThreshold(4096);  
        fu.setHeaderEncoding(encoding);
        fu.setRepositoryPath(tempDirectory);          //设置临时目录.
        try {
        //解析参数,在后面进行文件字段和普通字段值的进一步处理
        fileItems = fu.parseRequest(request);   //解析请求,返回一个集合.
       
        }
           catch (FileUploadException e) {
             
           
              thrownew Exception(e);
             
        }
           
       
         Iterator i = fileItems.iterator();
         //遍历解析好的参数,以区分文件还是普通字段,并作相应的处理(存入不同的hashMap)
           while(i.hasNext())
        {
           FileItem fi = (FileItem)i.next();
               //判断当前项是否为普通字段
               if(fi.isFormField())                        //这是用来确定是否为文件属性,
               {
                  Vector vec=new Vector();
                  //需改正
                  String fieldName = fi.getFieldName();     //这里取得字段名称
                  //如果已经存在此字段信息(多选列表或多个同名的隐藏域等)
                  if(fieldsMap.get(fieldName)!=null)
                  {
                 vec=(Vector)fieldsMap.get(fieldName);
                 logger.info("value: fi.getString(request.getCharacterEncoding()));
                 //很重要!需要进行编码哦!!!
                 vec.add(fi.getString(request.getCharacterEncoding()));
                  }
                  //第一次取到这个名的字段
                  else
                  {
                   logger.info("value: "+fi.getString(request.getCharacterEncoding()));
                   vec.add(fi.getString(request.getCharacterEncoding()));
                   fieldsMap.put(fieldName,vec);
                  }
               }
               //为文件字段时
               else
               { 
                   //传来的文件名不为空时
               
                 String fullName=fi.getName();
                
                 if(fullName!=null&&!("".equals(fullName)))
                 {
                     //这里是一个封装好的类型,封装的不太好,其中的getRealName()不//好用,但是获取扩展名和文件名的方法还是可以的。
                 UploadedFile uploadedFile=new UploadedFile(fi);
                 filesMap.put(fi.getFieldName(),uploadedFile);
                
                 }
                
               }
 
        }
      
    }// FileUploadUtil
     
        
 
           /**
            *模仿request的getParameter方法,取得非文件的字段
            *如果为多个值的,只返回第一个
         *@paramparam
         *@return为空或键值不存在返回null
         */
        public String getParameter(String param)
        {
               
               if(param==null)
               {
                
                returnnull;
                
                }
               else
               {
                   Vector vec=(Vector)fieldsMap.get(param);
                  if(vec!=null&&vec.size()>0)
                  {
                   return (String)vec.get(0);
                  }
                  elsereturnnull;
               }
               
               
             
          
 
 
         }//getParameter
        public String[] getParameterValues(String param)
        {
        String[] values=null;
        if(param==null)
           {
            
            returnnull;
            
            }
           else
           {
            Vector vec=(Vector)this.fieldsMap.get(param);
            int size=vec.size();
            values=new String[size];
            if(vec!=null&&vec.size()>0)
                {
              for(int i=0;i<size;i++)
              {
             values[i]=(String)vec.get(i);
            
              }
              return values;
                 }
            else
            {
            returnnull;  
             }
            }//else
           
       
         }
       
       
        /**
         *
         *返回上传的文件的名称,如若没这个参数名,返回null
         *@paramparamName
         *@return
         */
        public String getFileName(String paramName)
        {
        if(paramName!=null)
         {
             UploadedFile uploadedFile=(UploadedFile)this.filesMap.get(paramName);
             if(uploadedFile!=null)
             {
                 return uploadedFile.getRealName();
             }
            
         }
        returnnull;
                
       
        }
         /**
          *这个方法用来将文件字段保存在硬盘上。
         *@paramparamName
         *@paramnewNameWithoutExt
         *@paramrelativePath
         *@throwsBaseWebException
         */
        publicvoid upLoadFile(String paramName,String newNameWithoutExt,String relativePath) throws Exception
         {
         if(paramName!=null)
         {
             UploadedFile uploadedFile=(UploadedFile)this.filesMap.get(paramName);
             if(uploadedFile!=null&&uploadedFile.fileItem.getSize()>0)
             {
               String path=request.getSession().getServletContext().getRealPath("/");
               path+=relativePath+newNameWithoutExt;
               uploadedFile.write(path);
               
             }
         }
        
        
         }
   
   
    publicstaticvoid main(String[] args)
    {
    }
 
 
 
    public List getFileItems() {
        returnfileItems;
    }
 
 
 
    publicvoid setFileItems(List fileItems) {
        this.fileItems = fileItems;
    }
 
 
 
    public HashMap getFieldsMap() {
        returnfieldsMap;
    }
 
 
 
    publicvoid setFieldsMap(HashMap fieldsMap) {
        this.fieldsMap = fieldsMap;
    }
 
 
 
    public HashMap getFilesMap() {
        returnfilesMap;
    }
 
 
 
    publicvoid setFilesMap(HashMap filesMap) {
        this.filesMap = filesMap;
    }
 
 
 
    public DiskFileUpload getFu() {
        returnfu;
    }
 
 
 
    publicvoid setFu(DiskFileUpload fu) {
        this.fu = fu;
    }
 
 
 
    public HttpServletRequest getRequest() {
        returnrequest;
    }
 
 
 
    publicvoid setRequest(HttpServletRequest request) {
        this.request = request;
    }
}
 
 
 
//辅助的文件封装字段,还很不完善,比如缺少获取文件流的方法,以后考虑创建adapter
//来实现封装对象fileItem的一些方法。这里主要提供了获取扩展名和文件名的方法,比较//简陋
publicclass UploadedFile {
   
    private String fullName="";
    public FileItem fileItem;
   
  
    /**
     *@paramfileItem
     */
    public UploadedFile(FileItem fileItem) {
 
        this.fileItem = fileItem;
        fullName=fileItem.getName();
       
    }
   
   
    public String getFileNameWithoutExt()
    {
        returnnull;
    }
    //返回文件的扩展名
    public String getExt()
    {  
        String[] values= fullName.split("//.");
     
        return values[values.length-1];
       
    }
    //不好用这个方法!!
    public String getRealName()
    {
            String[] values= fullName.split("//////");
         
            return values[values.length-1];
       
    }
    public String getBaseFileName() {
 
        // First, ask the JDK for the base file name.
        String fileName = new File(this.fileItem.getName()).getName();
 
        // Now check for a Windows file name parsed incorrectly.
        int colonIndex = fileName.indexOf(":");
        if (colonIndex == -1) {
            // Check for a Windows SMB file path.
            colonIndex = fileName.indexOf("////");
        }
        int backslashIndex = fileName.lastIndexOf("//");
 
        if (colonIndex > -1 && backslashIndex > -1) {
            // Consider this filename to be a full Windows path, and parse it
            // accordingly to retrieve just the base file name.
            fileName = fileName.substring(backslashIndex + 1);
        }
 
        return fileName;
    }
    publicvoid write(String path) throws Exception
    {
       
        try {
            fileItem.write(new File(path));
        } catch (Exception e) {
            thrownew Exception(e);
           
        }    
    }
   
   
 
}
 
 
 
 
使用方法就是分的简单了:

FileUploadUtil fu;
                     fu = new FileUploadUtil(request,"c:/");
                     String name=fu.getParameter("name");
                     logger.info("字段名; name ,值:"+name);
                     Map fileMap=fu.getFilesMap();
                     UploadedFile ufile=(UploadedFile) fileMap.get("myFile");
                     …………
           下面要做的工作就是保存到数据库中或硬盘上了,下次再说哦!!
           写得不好,希望大家多提意见
 
原创粉丝点击