文件上传工具类——傻瓜式上传文件
Posted 行者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件上传工具类——傻瓜式上传文件相关的知识,希望对你有一定的参考价值。
转载请注明原文地址: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方法实现上传功能 %>
以上是关于文件上传工具类——傻瓜式上传文件的主要内容,如果未能解决你的问题,请参考以下文章