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