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

翻译|其它|编辑:郝浩|2007-06-25 09:30:45.000|阅读 4103 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

使用 FileUpLoad 包进行文件上传。
进行文件上传一般有三种方式
1.        使用 fileUpLoad
2.        使用 smartFileUpLoad
3.        自己编写类似的程序进行解析
下面介绍一下第一种方式的使用方法:
fileUpLoad apache 的一个开源项目,用来进行解析带有文件的请求处理。著名的 struts FormFile 就是用的它进行解析处理的。
1.        首先页面上我们需要将表单设置下面类似的参数:
< form method="post" enctype="multipart/form-data" action=”………… ” >
2.        然后我们需要在工程里导入所需要的包,可以在 apache 网站上下载:
http://jakarta.apache.org/commons/fileupload/
3.        在我们的servlet中可以获取到request参数,然后可以这样取传递过来的字段参数及文件参数:
在这里我写了两个类去生成并存储字段和文件的值:
可以跟着红色的注释代码看一下实现的过程
/**
*封装了 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");
                     …………
           下面要做的工作就是保存到数据库中或硬盘上了,下次再说哦!!
           写得不好,希望大家多提意见
 

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP