實現文件上傳工具類


   轉載請注明原文地址: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方法實現上傳功能
%>

 

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM