欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java FileUploadUtil工具类详解

程序员文章站 2024-02-25 19:21:09
本文实例为大家分享了fileuploadutil工具类的具体代码,供大家参考,具体内容如下 package com.gootrip.util; import...

本文实例为大家分享了fileuploadutil工具类的具体代码,供大家参考,具体内容如下

package com.gootrip.util;

import java.io.file;
import java.util.*;
import org.apache.commons.fileupload.*;
import javax.servlet.http.httpservletrequest;
import java.util.regex.pattern;
import java.io.ioexception;
import org.apache.commons.fileupload.servlet.servletfileupload;
import org.apache.commons.fileupload.disk.diskfileitemfactory;
import java.util.regex.matcher;

public class fileuploadutil {

  //当上传文件超过限制时设定的临时文件位置,注意是绝对路径
  private string temppath = null;

  //文件上传目标目录,注意是绝对路径
  private string dstpath = null;

  //新文件名称,不设置时默认为原文件名
  private string newfilename = null;
  //获取的上传请求
  private httpservletrequest fileuploadreq = null;

  //设置最多只允许在内存中存储的数据,单位:字节,这个参数不要设置太大
  private int sizethreshold = 4096;

  //设置允许用户上传文件大小,单位:字节
  //共10m
  private long sizemax = 10485760;

  //图片文件序号
  private int picseqno = 1;

  private boolean issmallpic = false;

  public fileuploadutil(){
  }

  public fileuploadutil(string temppath, string destinationpath){
    this.temppath = temppath;
    this.dstpath = destinationpath;
  }

  public fileuploadutil(string temppath, string destinationpath, httpservletrequest fileuploadrequest){
    this.temppath  = temppath;
    this.dstpath = destinationpath;
    this.fileuploadreq = fileuploadrequest;
  }

  /** 文件上载
   * @return true —— success; false —— fail.
   */
  public boolean upload(){
    diskfileitemfactory factory = new diskfileitemfactory();

    try {

      //如果没有上传目的目录,则创建它
      fileutil.makedirectory(dstpath+"/ddd");
      /*if (!fileutil.makedirectory(dstpath+"/ddd")) {
        throw new ioexception("create destination directory error.");
      }*/
      //如果没有临时目录,则创建它
      fileutil.makedirectory(temppath+"/ddd");
      /*if (!fileutil.makedirectory(temppath+"/ddd")) {
        throw new ioexception("create temp directory error.");
      }*/

      //上传项目只要足够小,就应该保留在内存里。
      //较大的项目应该被写在硬盘的临时文件上。
      //非常大的上传请求应该避免。
      //限制项目在内存中所占的空间,限制最大的上传请求,并且设定临时文件的位置。

      //设置最多只允许在内存中存储的数据,单位:字节
      factory.setsizethreshold(sizethreshold);
      // the location for saving data that is larger than getsizethreshold()
      factory.setrepository(new file(temppath));

      servletfileupload upload = new servletfileupload(factory);
      //设置允许用户上传文件大小,单位:字节
      upload.setsizemax(sizemax);

      list fileitems = upload.parserequest(fileuploadreq);
      // assume we know there are two files. the first file is a small
      // text file, the second is unknown and is written to a file on
      // the server
      iterator iter = fileitems.iterator();

      // 正则匹配,过滤路径取文件名
      string regexp = ".+\\\\(.+)$";

      // 过滤掉的文件类型
      string[] errortype = {".exe", ".com", ".cgi", ".asp", ".php", ".jsp"};
      pattern p = pattern.compile(regexp);
      while (iter.hasnext()) {
        system.out.println("++00++====="+newfilename);
        fileitem item = (fileitem) iter.next();
        //忽略其他不是文件域的所有表单信息
        if (!item.isformfield()) {
          string name = item.getname();
          system.out.println("++++====="+name);
          long size = item.getsize();
          //有多个文件域时,只上传有文件的
          if ((name == null || name.equals("")) && size == 0)
            continue;
          matcher m = p.matcher(name);
          boolean result = m.find();
          if (result) {
            for (int temp = 0; temp < errortype.length; temp++) {
              if (m.group(1).endswith(errortype[temp])) {
                throw new ioexception(name + ": wrong file type");
              }
            }
            string ext = "."+fileutil.gettypepart(name);
            try {
              //保存上传的文件到指定的目录
              //在下文中上传文件至数据库时,将对这里改写
              //没有指定新文件名时以原文件名来命名
              if (newfilename == null || newfilename.trim().equals(""))
              {
                item.write(new file(dstpath +"/"+ m.group(1)));
              }
              else
              {
                string uploadfilename = "";
                if (issmallpic)
                {
                  uploadfilename = dstpath +"/"+ newfilename+"_"+picseqno+"_small"+ext;
                }
                else
                {
                  uploadfilename = dstpath +"/"+ newfilename+"_"+picseqno+ext;
                }
                //生成所有未生成的目录
                system.out.println("++++====="+uploadfilename);
                fileutil.makedirectory(uploadfilename);
                //item.write(new file(dstpath +"/"+ newfilename));
                item.write(new file(uploadfilename));
              }
              picseqno++;
              //out.print(name + "  " + size + "<br>");
            } catch (exception e) {
              //out.println(e);
              throw new ioexception(e.getmessage());
            }
          } else {
            throw new ioexception("fail to upload");
          }
        }
      }
    } catch (ioexception e) {
      system.out.println(e);
    } catch (fileuploadexception e) {
      system.out.println(e);
    }
    return true;
  }

  /**从路径中获取单独文件名
   * @author
   *
   * todo 要更改此生成的类型注释的模板,请转至
   * 窗口 - 首选项 - java - 代码样式 - 代码模板
   */
  public string getfilename(string filepath)
  {
    string returnstr = "*.*";
    int length    = filepath.trim().length();

    filepath = filepath.replace('\\', '/');
    if(length >0)
    {
      int i = filepath.lastindexof("/");
      if (i >= 0)
      {
        filepath = filepath.substring(i + 1);
        returnstr = filepath;
      }
    }
    return returnstr;
  }
  /**
   * 设置临时存贮目录
   */
  public void settmppath(string tmppath)
  {
    this.temppath = tmppath;
  }
  /**
   * 设置目标目录
   */
  public void setdstpath(string dstpath) {
    this.dstpath = dstpath;
  }
  /**
   * 设置最大上传文件字节数,不设置时默认10m
   */
  public void setfilemaxsize(long maxsize) {
    this.sizemax = maxsize;
  }
  /**
   * 设置http 请求参数,通过这个能数来获取文件信息
   */
  public void sethttpreq(httpservletrequest httpreq) {
    this.fileuploadreq = httpreq;
  }
  /**
   * 设置http 请求参数,通过这个能数来获取文件信息
   */
  public void setnewfilename(string filename) {
    this.newfilename = filename;
  }

  /**
   * 设置此上传文件是否是缩略图文件,这个参数主要用于缩略图命名
   */
  public void setissmalpic(boolean issmallpic) {
    this.issmallpic = issmallpic;
  }

  /**
   * 设置http 请求参数,通过这个能数来获取文件信息
   */
  public void setpicseqno(int seqno) {
    this.picseqno = seqno;
  }


}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。