文件上传工具类——傻瓜式上传文件

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方法实现上传功能
%>

 

   

以上是关于文件上传工具类——傻瓜式上传文件的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 HttpWebRequest 上传文件?

java Ftp上传创建多层文件的代码片段

android的自带的httpClient 怎么上传文件

FastDFS 工具类实现文件上传_02

PHP 图片上传工具类(支持多文件上传)

OSS对象存储,网页版上传文件操作,傻瓜看图有手就行!