zoukankan      html  css  js  c++  java
  • 实现文件上传工具类

       转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6128382.html

       具体代码已移植github:https://github.com/ygj0930/MyUploadUtils  大家给我个star呀~

       在前面  (http://www.cnblogs.com/ygj0930/p/6073505.html)  我们提到过Javaweb开发的文件上传功能的实现,需要借助第三方jar包,并且要创建factory呀、设置临时文件区路径呀等等,十分繁琐。而作为一个开发人员,不可能每次实现文件上传时都从头到尾做那么多工序。这时候,我们可以把这些繁琐的工作封装起来,把一个个功能做成以供调用的方法。在我们实现文件上传时,只需单纯地导入工具类,然后调用相应的方法即可。因此,我们就有了文件上传工具类的构思。

        文件上传工具类的实质就是,把繁琐的工作按照函数块来封装,外界通过函数名来调用函数取得结果即可。那么,我们在文件上传过程中,需要用到的常用功能有哪些呢?我这里的工具类大概实现了以下几种,还有其他更多的功能读者可以按需实现:

    设定保存路径
    设定缓冲路径
    设定缓冲大小
    设定文件类型
    获取文件扩展名
    验证文件类型有效性
    表单内容获取:文字以键值对保存在map中。文件保存到保存目录下
    获取上传的文件内容们(返回map给调用者)

       下面是源码:

        导入所需的类:

       

    import java.util.*;
    import java.lang.*;
    import java.io.File;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import javax.servlet.http.HttpServletRequest;
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;

        定义一系列备用的变量、数组、要用到的类对象、工具类的一系列构造函数等

        private String[] fileTypes=null;//允许上传的文件类型们
        private String dstPath=null;//文件保存路径
        private long fileSizeMax=10*1024*1024;//允许上传的文件最大值
        private String cachePath=null;//缓存路径
        private int cacheSizeMax=5*1024*1024;//最大缓存容量
        private Map<String,String> textcontent;//上传表单中的文本内容用map来保存
        
        private ServletFileUpload sfupload;//实现上传功能的主要类
        private DiskFileItemFactory factory=new DiskFileItemFactory();//定义工厂来配置上传路径、缓冲区位置等
        
        public myUploadUtil(){};
        
        public myUploadUtil(String dst,String cache,String[] fileTypes,long fileSizeMax,int cacheSizeMax)
        {
            super();
            this.dstPath=dst;
            this.cachePath=cache;
            this.fileTypes=fileTypes;
            this.fileSizeMax=fileSizeMax;
            this.cacheSizeMax=cacheSizeMax;
        }
        
        public myUploadUtil(String dst,String cache,String[] fileTypes)
        {
            super();
            this.dstPath=dst;
            this.cachePath=cache;
            this.fileTypes=fileTypes;
        }

        定义setXX()方法供外界调用来设定路径值、缓存路径、文件类型等等:

    public void setCachePath(String cachePath){
            this.cachePath=cachePath;
        }
        public void setCacheSize(int size){
            this.cacheSizeMax=size;
        }
        public void setDstPath(String path){
            this.dstPath=path;
        }
        public void setFileSize(long size){
            this.fileSizeMax=size;
        }
        public void setFileType(String[] types){
            this.fileTypes=types;
        }

        定义一系列功能方法:获取内容、判断文件类型合法性等等:

    //获取文件扩展名
        public String getFileExt(File file){
            String path=file.getName();
            return path.substring(path.lastIndexOf(".")+1);
        }
        //供外界调用获取上传表单中的文本内容
        public Map<String,String> getTextContent(){
            return textcontent;
        }
        //把提取到的文本内容们赋给类本身的map对象,以供外界取用
        public void setTextContent(Map<String,String> map){
            this.textcontent=map;
        }
        //单例模式获取文件上传类,如果不存在则创建,存在则赋给sfuload以免重复创建
        public ServletFileUpload getServletFileUpload(){
            if(sfupload==null){
                sfupload=new ServletFileUpload(factory);
                return sfupload;
            }else{
                return sfupload;
            }
        }
        //判断文件是否为合法的类型
        public boolean isFileValidate(File file){
            if(fileTypes==null){return true;}
            for(int i=0;i<fileTypes.length;++i){
                if(fileTypes[i].equals(getFileExt(file))){
                    return true;
                }
            }
            return false;
        }
        //创建文件目录:用于后面根据路径来创建文件保存目录、缓存目录
        public void makeDir(String url){        
                File file=new File(url);
                if(!file.exists()){
                    if(!file.mkdirs()){
                        System.out.println("fail to create dir!");
                    }
                }
        }

        最后,定义上传方法:

    //上传方法
        public void upload(HttpServletRequest request){
            
            try{
            if(!ServletFileUpload.isMultipartContent(request)){
                return;
            }
            makeDir(dstPath);//创建文件保存目录
            makeDir(cachePath);    //创建缓存目录
            factory.setRepository(new File(cachePath));//设置缓存路径
            factory.setSizeThreshold(cacheSizeMax);//设置缓存大小
            ServletFileUpload sfu=getServletFileUpload();//获取上传类    
            sfu.setFileSizeMax(fileSizeMax);//设置上传文件允许的最大值
            
        
            List<FileItem> items=sfu.parseRequest(request);//提取请求中附带的文件们
            Map<String,String> map =new HashMap<String,String>();//创建一个map对象来提取上传表单中的文本内容
            
            //迭代提取上传的文件们
            Iterator it=items.iterator();
            while(it.hasNext()){
                FileItem  fileItem=(FileItem)it.next();
                if(fileItem.isFormField()){//如果是文本内容,则提取出来放进map里
                    map.put(fileItem.getFieldName(),fileItem.getString("UTF-8"));
                }else{//如果不是文本,则为文件
                    String path=fileItem.getName();//获取文件名
                    long size=fileItem.getSize();//获取文件大小
                    if ("".equals(path) || size == 0) {//无效文件的判断
                    System.out.println("not validate file");
                    return;
                    }
                    
                    File file=new File(dstPath,new File(fileItem.getName()).getName());//根据文件名在文件保存路径下创建一个同名文件
                    if(!isFileValidate(file)){//判断文件类型是否合法
                    System.out.println("file type incorrect!");
                    }else{
                        fileItem.write(file);//文件合法,则通过IO流把上传文件写到文件路径下
    
                    }
                }
                }
            setTextContent(map);//表单文本内容提取完毕,把map中的内容set给类中的textContent对象。
            }catch(Exception ex){
                System.out.println(ex);
            }        
        }

        使用工具类:

        下面,我们来简单试试在实际应用中使用我们封装好的文件上传工具类:

       

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
    <%@page import="java.io.*"%>
    <%@page import="javax.servlet.*"%>
    <%@page import="javax.servlet.http.*"%>
    <%@page import="org.apache.commons.fileupload.servlet.*"%>
    <%@page import="upload.myUploadUtil"%>
    <%
        //定义允许上传的文件类型
        final String allowedExt[] ={"JPG","GIF"};
        //获取web应用在web服务器上的绝对路径,用来保存文件
        String realwebbase = request.getSession().getServletContext().getRealPath("/");
        //文件保存目录下创建临时文件保存目录
        String temp_file = realwebbase+"upload\UploadTemp";    
        myUploadUtil myupload=new myUploadUtil(realwebbase,temp_file,allowedExt);//创建文件上传工具类对象,把文件保存路径等作为参数初始化该对象
        myupload.upload(request);//对象调用upload方法实现上传功能
    %>

       

  • 相关阅读:
    Java程序员必知的8大排序(转载)
    Eclipse快捷键大全(转载)
    Java强引用、 软引用、 弱引用、虚引用(转)
    java数据类型二(转)
    为什么静态成员、静态方法中不能用this和super关键字(转)
    POJ 2002
    POJ 3126的教训
    POJ 3349
    POj 1105解题报告
    POJ 3278
  • 原文地址:https://www.cnblogs.com/ygj0930/p/6128382.html
Copyright © 2011-2022 走看看