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

2 篇文章 0 订阅
 
使用FileUpLoad包进行文件上传。
进行文件上传一般有三种方式
使用fileUpLoad
使用smartFileUpLoad
自己编写类似的程序进行解析
下面介绍一下第一种方式的使用方法:
fileUpLoad是apache的一个开源项目,用来进行解析带有文件的请求处理。著名的struts的FormFile就是用的它进行解析处理的。
 
 
1首先页面上我们需要将表单设置下面类似的参数:
< form method="post" enctype="multipart/form-data" action=”………… ” >
2 然后我们需要在工程里导入所需要的包,可以在apache网站上下载:
3 在我们的servlet中可以获取到request参数,然后可以这样取传递过来的字段参数及文件参数:
在这里我写了两个类去生成并存储字段和文件的值:
可以跟着红色的注释代码看一下实现的过程
/**
  * @author sxy
  *
  * 封装了FileUpload类,实现文件上传功能
  *
  */
public class FileUploadUtil {
    private static 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
      * @param request
      * @param tempDirectory
      * @throws BaseWebException
      */
    // 当生成一个类时就开始了对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) {
             
           
              throw new 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方法,取得非文件的字段
            * 如果为多个值的,只返回第一个
         * @param param
         * @return 为空或键值不存在返回 null
         */
        public String getParameter(String param)
        {
               
                if (param== null )
               {
                
                 return null ;
                
                }
                else
               {
                   Vector vec=(Vector) fieldsMap .get(param);
                  if (vec!= null &&vec.size()>0)
                  {
                    return (String)vec.get(0);
                  }
                  else return null ;
               }
               
               
             
          
 
 
         } //getParameter
        public String[] getParameterValues(String param)
        {
        String[] values= null ;
        if (param== null )
           {
            
             return null ;
            
            }
            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
            {
             return null ;  
             }
            } //else
           
       
         }
       
       
        /**
         *
         * 返回上传的文件的名称,如若没这个参数名,返回null
         * @param paramName
         * @return
         */
        public String getFileName(String paramName)
        {
        if (paramName!= null )
         {
             UploadedFile uploadedFile=(UploadedFile) this . filesMap .get(paramName);
             if (uploadedFile!= null )
             {
                 return uploadedFile.getRealName();
             }
            
         }
        return null ;
                
       
        }
         /**
          * 这个方法用来将文件字段保存在硬盘上。
         * @param paramName
         * @param newNameWithoutExt
         * @param relativePath
         * @throws BaseWebException
         */
        public void 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);
               
             }
         }
        
        
         }
   
   
    public static void main(String[] args)
    {
    }
 
 
 
    public List getFileItems() {
        return fileItems ;
    }
 
 
 
    public void setFileItems(List fileItems) {
        this . fileItems = fileItems;
    }
 
 
 
    public HashMap getFieldsMap() {
        return fieldsMap ;
    }
 
 
 
    public void setFieldsMap(HashMap fieldsMap) {
        this . fieldsMap = fieldsMap;
    }
 
 
 
    public HashMap getFilesMap() {
        return filesMap ;
    }
 
 
 
    public void setFilesMap(HashMap filesMap) {
        this . filesMap = filesMap;
    }
 
 
 
    public DiskFileUpload getFu() {
        return fu ;
    }
 
 
 
    public void setFu(DiskFileUpload fu) {
        this . fu = fu;
    }
 
 
 
    public HttpServletRequest getRequest() {
        return request ;
    }
 
 
 
    public void setRequest(HttpServletRequest request) {
        this . request = request;
    }
}
 
 
 
// 辅助的文件封装字段,还很不完善,比如缺少获取文件流的方法,以后考虑创建 adapter
// 来实现封装对象 fileItem 的一些方法。这里主要提供了获取扩展名和文件名的方法,比较 // 简陋
public class UploadedFile {
   
    private String fullName = "" ;
    public FileItem fileItem ;
   
  
    /**
      * @param fileItem
      */
    public UploadedFile(FileItem fileItem) {
 
        this . fileItem = fileItem;
        fullName =fileItem.getName();
       
    }
   
   
    public String getFileNameWithoutExt()
    {
        return null ;
    }
    // 返回文件的扩展名
    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;
    }
    public void write(String path) throws Exception
    {
       
        try {
            fileItem .write( new File(path));
        } catch (Exception e) {
            throw new 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");
                     …………
           下面要做的工作就是保存到数据库中或硬盘上了,下次再说哦!!
           写得不好,希望大家多提意见
 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值