最近在搭建一个项目,需要用到很多通用的工具类,自己也写了几个。现在分享一下,也方便自己以后使用。如果你觉得不错的话,也欢迎转载。
blog
http://blog.csdn.net/IBM_hoojo
http://hoojo.cnblogs.com
http://hoojo.blogjava.net
email
hoojo_@126.com
文件上传 状态枚举类:
package
com.hoo.enums;
/**
* <b>function:</b>
文件上传
状态
* @package com.hoo.enums
* @fileName UploadState.java
* @createDate 2010-10-11 下午12:18:14
* @author hoojo
*/
public
enum
UploadState {
UPLOAD_SUCCSSS(0,
"上传文件成功!"
),
UPLOAD_FAILURE(1,
"上传文件失败!"
),
UPLOAD_TYPE_ERROR(2,
"上传文件类型错误!"
),
UPLOAD_OVERSIZE(3,
"上传文件过大!"
),
UPLOAD_ZEROSIZE(4,
"上传文件为空!"
),
UPLOAD_NOTFOUND(5,
"上传文件路径错误!"
);
private
String state;
private
int
flag;
public
String getState() {
return
this
.state;
}
public
int
getFlag() {
return
this
.flag;
}
UploadState(
int
flag, String state) {
this
.state = state;
this
.flag = flag;
}
}
文件上传 工具类code:
package
com.hoo.util;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileNotFoundException;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
java.util.Random;
import
java.util.UUID;
import
org.apache.commons.io.FileUtils;
import
com.hoo.enums.UploadState;
/***
* <b>function:</b>
文件上传
工具类
* @author hoojo
* @createDate Oct 9, 2010 11:12:47 PM
* @file UploadFileUtils.java
* @package com.hoo.util
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public
abstract
class
UploadFileUtils {
//上传文件保存路径
public
static
String path =
"/upload/"
;
//定义可以上传文件的后缀数组,默认"*",代表所有
public
static
String[] filePostfixs = {
"*"
};
public
static
String[] typeImages = {
"gif"
,
"jpeg"
,
"png"
,
"jpg"
,
"tif"
,
"bmp"
};
public
static
String[] typeOthers = {
"html"
,
"htm"
,
"doc"
,
"xls"
,
"txt"
,
"zip"
,
"rar"
,
"pdf"
,
"cll"
};
//上传文件的最大长度
public
static
long
maxFileSize = 1024 * 1024 * 1024 * 2L;
//2G
//一次读取多少字节
public
static
int
bufferSize = 1024 * 8;
private
final
static
void
init() {
if
(bufferSize > Integer.MAX_VALUE) {
bufferSize = 1024 * 8;
}
else
if
(bufferSize < 8) {
bufferSize = 8;
}
if
(maxFileSize < 1) {
maxFileSize = 1024 * 1024 * 1024 * 2L;
}
else
if
(maxFileSize > Long.MAX_VALUE) {
maxFileSize = 1024 * 1024 * 1024 * 2L;
}
}
/**
* <b>function:</b>通过输入流参数上传文件
* @author hoojo
* @createDate Oct 9, 2010 11:22:47 PM
* @param uploadFileName 文件名称
* @param savePath 保存路径
* @param InputStream 上传的文件的输入流
* @return 是否上传成功
* @throws Exception
*/
public
static
UploadState upload4Stream(String fileName, String path, InputStream is)
throws
Exception {
init();
UploadState state = UploadState.UPLOAD_FAILURE;
FileOutputStream fos = null;
try
{
path = getDoPath(path);
mkDir(path);
fos =
new
FileOutputStream(path + fileName);
byte
[] buffer =
new
byte
[bufferSize];
int
len = 0;
while
((len = is.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
state = UploadState.UPLOAD_SUCCSSS;
}
catch
(FileNotFoundException e) {
state = UploadState.UPLOAD_NOTFOUND;
throw
e;
}
catch
(IOException e) {
state = UploadState.UPLOAD_FAILURE;
throw
e;
}
finally
{
if
(is != null) {
is.close();
}
if
(fos != null) {
fos.flush();
fos.close();
}
}
return
state;
}
/**
* <b>function:</b>上传文件
* @author hoojo
* @createDate Oct 9, 2010 11:33:27 PM
* @param uploadFileName 文件名称
* @param savePath 保存路径
* @param uploadFile 上传的文件
* @return 是否上传成功
* @throws Exception
*/
public
static
UploadState upload4Stream(String fileName, String path, File file)
throws
Exception {
init();
UploadState state = UploadState.UPLOAD_FAILURE;
FileInputStream fis = null;
try
{
long
size = file.length();
if
(size <= 0) {
state = UploadState.UPLOAD_ZEROSIZE;
}
else
{
if
(size <= maxFileSize) {
fis =
new
FileInputStream(file);
state = upload4Stream(fileName, path, fis);
}
else
{
state = UploadState.UPLOAD_OVERSIZE;
}
}
}
catch
(FileNotFoundException e) {
state = UploadState.UPLOAD_NOTFOUND;
throw
e;
}
catch
(IOException e) {
state = UploadState.UPLOAD_FAILURE;
throw
e;
}
finally
{
if
(fis != null) {
fis.close();
}
}
return
state;
}
/**
* <b>function:</b>通过数组进行验证文件类型上传
* @author hoojo
* @createDate Oct 10, 2010 3:39:34 PM
* @param fileName 文件名称
* @param path 文件路径
* @param file 文件
* @param allowTypes 文件后缀、类型数组
* @return 返回是否上传成功
* @throws Exception
*/
public
static
UploadState upload4Stream(String fileName, String path, File file, String[] allowTypes)
throws
Exception {
UploadState state = UploadState.UPLOAD_FAILURE;
if
(validTypeByName(fileName, allowTypes)) {
state = upload4Stream(fileName, path, file);
}
else
{
state = UploadState.UPLOAD_TYPE_ERROR;
}
return
state;
}
/**
* <b>function:</b>通过数组进行验证文件类型上传
* @author hoojo
* @createDate Oct 10, 2010 3:43:30 PM
* @param fileName 文件名称
* @param path 文件路径
* @param InputStream 文件输入流
* @param allowTypes 文件后缀、类型数组
* @return 返回是否上传成功
* @throws Exception
*/
public
static
UploadState upload4Stream(String fileName, String path, InputStream fs, String[] allowTypes)
throws
Exception {
UploadState state = UploadState.UPLOAD_FAILURE;
if
(validTypeByName(fileName, allowTypes)) {
state = upload4Stream(fileName, path, fs);
}
else
{
state = UploadState.UPLOAD_TYPE_ERROR;
}
return
state;
}
/**
* <b>function:</b> 利用FileUtils上传文件;其中maxFileSize是限制上传文件的大小
* @author hoojo
* @createDate Oct 9, 2010 11:49:15 PM
* @param fileName 文件名称
* @param path 保存路径
* @param file 文件
* @return 是否上传成功
* @throws Exception
*/
public
static
boolean
upload4CopyFile(String fileName, String path, File file)
throws
Exception {
init();
boolean
success = false;
if
(file.length() <= maxFileSize) {
path = getDoPath(path);
mkDir(path);
File destFile =
new
File(path, fileName);
FileUtils.copyFile(file, destFile);
success = true;
}
return
success;
}
/**
* <b>function:</b>上传指定文件类型的文件
* @author hoojo
* @createDate Oct 10, 2010 12:30:09 PM
* @param fileName 文件名
* @param path 路径
* @param file 文件
* @param allowTypes 类型、后缀数组
* @return 成功上传的文件名
* @throws Exception
*/
public
static
boolean
upload4CopyFile(String fileName, String path, File file, String[] allowTypes)
throws
Exception {
boolean
success = false;
if
(validTypeByName(fileName, allowTypes)) {
success = upload4CopyFile(fileName, path, file);
}
return
success;
}
/**
* <b>function:</b> 根据文件名和类型数组验证文件类型是否合法,flag是否忽略大小写
* @author hoojo
* @createDate Oct 10, 2010 11:54:54 AM
* @param fileName 文件名
* @param allowTypes 类型数组
* @param flag 是否获得大小写
* @return 是否验证通过
*/
public
static
boolean
validTypeByName(String fileName, String[] allowTypes,
boolean
flag) {
String suffix = getType(fileName);
boolean
valid = false;
if
(allowTypes.length > 0 &&
"*"
.equals(allowTypes[0])) {
valid = true;
}
else
{
for
(String type : allowTypes) {
if
(flag) {
//不区分大小写后缀
if
(suffix != null && suffix.equalsIgnoreCase(type)) {
valid = true;
break
;
}
}
else
{
//严格区分大小写
if
(suffix != null && suffix.equals(type)) {
valid = true;
break
;
}
}
}
}
return
valid;
}
/**
* <b>function:</b>根据文件名称和类型数组验证文件类型是否合法
* @author hoojo
* @createDate Oct 10, 2010 10:27:17 AM
* @param fileName 文件名
* @param allowTypes 文件类型数组
* @return 是否合法
*/
public
static
boolean
validTypeByName(String fileName, String[] allowTypes) {
return
validTypeByName(fileName, allowTypes, true);
}
/**
* <b>function:</b> 根据后缀和类型数组验证文件类型是否合法,flag是否区分后缀大小写,true严格大小写
* @author hoojo
* @createDate Oct 10, 2010 12:00:10 PM
* @param suffix 后缀名
* @param allowTypes 文件类型数组
* @param flag 是否区分大小写
* @return 是否合法
*/
public
static
boolean
validTypeByPostfix(String suffix, String[] allowTypes,
boolean
flag) {
boolean
valid = false;
if
(allowTypes.length > 0 &&
"*"
.equals(allowTypes[0])) {
valid = true;
}
else
{
for
(String type : allowTypes) {
if
(flag) {
//不区分大小写后缀
if
(suffix != null && suffix.equalsIgnoreCase(type)) {
valid = true;
break
;
}
}
else
{
//严格区分大小写
if
(suffix != null && suffix.equals(type)) {
valid = true;
break
;
}
}
}
}
return
valid;
}
/**
* <b>function:</b>根据文件后缀名和类型数组,验证文件类型是否合法
* @author hoojo
* @createDate Oct 10, 2010 10:25:32 AM
* @param suffix 后缀名
* @param allowTypes 类型数组
* @return 是否合法
*/
public
static
boolean
validTypeByPostfix(String suffix, String[] allowTypes) {
return
validTypeByPostfix(suffix, allowTypes, true);
}
/**
* <b>function:</b>验证当前后缀、文件类型是否是图片类型
* typeImages 可以设置图片类型
* @author hoojo
* @createDate Oct 10, 2010 12:17:18 PM
* @param suffix 验证文件的后缀
* @return 是否合法
*/
public
static
boolean
validTypeByPostfix4Images(String suffix) {
return
validTypeByPostfix(suffix, typeImages);
}
/**
* <b>function:</b>验证当前后缀、文件类型是否是非图片类型(常用办公文件类型)
* typeOthers 可以设置文件类型
* @author hoojo
* @createDate Oct 10, 2010 12:18:18 PM
* @param suffix 验证文件的后缀
* @return 是否合法
*/
public
static
boolean
validTypeByPostfix4Others(String suffix) {
return
validTypeByPostfix(suffix, typeOthers);
}
/**
* <b>function:</b>验证当前文件名、文件类型是否是图片类型
* typeImages 可以设置图片类型
* @author hoojo
* @createDate Oct 10, 2010 12:19:18 PM
* @param fileName 验证文件的名称
* @return 是否合法
*/
public
static
boolean
validTypeByName4Images(String fileName) {
return
validTypeByName(fileName, typeImages);
}
/**
* <b>function:</b>验证当前文件名称、文件类型是否是非图片类型(常用办公文件类型)
* typeOthers 可以设置文件类型
* @author hoojo
* @createDate Oct 10, 2010 12:21:22 PM
* @param fileName 验证文件的名称
* @return 是否合法
*/
public
static
boolean
validTypeByName4Others(String fileName) {
return
validTypeByName(fileName, typeOthers);
}
/**
* <b>function:</b>传递一个路径和文件名称,删除该文件
* @author hoojo
* @createDate Oct 10, 2010 10:47:57 AM
* @param fileName 文件名称
* @param path 路径
* @return 是否删除成功
*/
public
static
boolean
removeFile(String fileName, String path) {
boolean
flag = false;
if
(isFileExist(fileName, path)) {
File file =
new
File(getDoPath(path) + fileName);
flag = file.delete();
}
return
flag;
}
/**
* <b>function:</b>删除当前文件
* @author hoojo
* @createDate Oct 10, 2010 10:49:54 AM
* @param file 要删除的文件
* @return 是否删除成功
*/
public
static
boolean
removeFile(File file) {
boolean
flag = false;
if
(file != null && file.exists()) {
flag = file.delete();
}
return
flag;
}
/**
* <b>function:</b>删除某个文件
* @author hoojo
* @createDate Oct 12, 2010 9:33:06 PM
* @param path 传递该文件路径
* @return 删除是否成功
*/
public
static
boolean
removeFile(String path) {
return
removeFile(
new
File(path));
}
/**
* <b>function:</b>删除当前文件下面所有文件
* @author hoojo
* @createDate Oct 12, 2010 9:27:33 PM
* @param file File 要删除的文件夹下面文件的文件对象
* @return 是否删除成功,如果有一个文件删除失败,将返回false
*/
public
static
boolean
removeFile4Dir(File file) {
boolean
flag = false;
if
(file != null && file.exists() && file.isDirectory()) {
File[] allFile = file.listFiles();
for
(File f : allFile) {
flag = f.delete();
if
(!flag) {
System.err.println(
"删除文件"
+ f.getAbsolutePath() +
"出错了!"
);
break
;
}
}
}
return
flag;
}
/**
* <b>function:</b>删除当前目录下所有文件
* @author hoojo
* @createDate Oct 12, 2010 9:34:41 PM
* @param path 目录、路径
* @return 是否成功
*/
public
static
boolean
removeFile4Dir(String path) {
return
removeFile4Dir(
new
File(path));
}
/**
* <b>function:</b>删除某个文件夹下的所有文件(除目录),包含子文件夹的文件
* @author hoojo
* @createDate Oct 12, 2010 9:30:01 PM
* @param file 即将删除文件夹对象
* @return 是否删除成功
*/
public
static
boolean
removeAllFile4Dir(File file) {
boolean
flag = false;
if
(file != null && file.exists() && file.isDirectory()) {
File[] allFile = file.listFiles();
for
(File f : allFile) {
if
(!f.isDirectory()) {
flag = f.delete();
}
else
{
flag = removeAllFile4Dir(f);
}
if
(!flag) {
System.err.println(
"删除文件"
+ f.getAbsolutePath() +
"出错了!"
);
break
;
}
}
}
return
flag;
}
/**
* <b>function:</b>删除某个目录下所有文件(不包含文件夹,包含文件夹下的文件)
* @author hoojo
* @createDate Oct 12, 2010 9:36:17 PM
* @param path
* @return
*/
public
static
boolean
removeAllFile4Dir(String path) {
return
removeAllFile4Dir(
new
File(path));
}
/**
* <b>function:</b> 传入一个文件名,得到这个文件名称的后缀
* @author hoojo
* @createDate Oct 9, 2010 11:30:46 PM
* @param fileName 文件名
* @return 后缀名
*/
public
static
String getSuffix(String fileName) {
int
index = fileName.lastIndexOf(
"."
);
if
(index != -1) {
String suffix = fileName.substring(index);
//后缀
return
suffix;
}
else
{
return
null;
}
}
/**
* <b>function:</b>和文件后缀一样,不同的是没有“.”
* @author hoojo
* @createDate Oct 10, 2010 2:42:43 PM
* @param fileName 文件名称
* @return
*/
public
static
String getType(String fileName) {
int
index = fileName.lastIndexOf(
"."
);
if
(index != -1) {
String suffix = fileName.substring(index + 1);
//后缀
return
suffix;
}
else
{
return
null;
}
}
/**
* <b>function:</b> 传递一个文件名称和一个新名称,组合成一个新的带后缀文件名
* 当传递的文件名没有后缀,会添加默认的后缀
* @author hoojo
* @createDate Oct 9, 2010 10:53:06 PM
* @param fileName 文件名称
* @param newName 新文件名称
* @param nullSuffix 为没有后缀的文件所添加的后缀;eg:txt
* @return String 文件名称
*/
public
static
String getNewFileName(String fileName, String newName, String nullSuffix) {
String suffix = getSuffix(fileName);
if
(suffix != null) {
newName += suffix;
}
else
{
newName = newName.concat(
"."
).concat(nullSuffix);
}
return
newName;
}
/**
* <b>function:</b> 利用uuid产生一个随机的name
* @author hoojo
* @createDate Oct 9, 2010 10:45:27 PM
* @param fileName 带后缀的文件名称
* @return String 随机生成的name
*/
public
static
String getRandomName(String fileName) {
String randomName = UUID.randomUUID().toString();
return
getNewFileName(fileName, randomName,
"txt"
);
}
/**
* <b>function:</b> 用当前日期、时间和1000以内的随机数组合成的文件名称
* @author hoojo
* @createDate Oct 9, 2010 11:01:47 PM
* @param fileName 文件名称
* @return 新文件名称
*/
public
static
String getNumberName(String fileName) {
SimpleDateFormat format =
new
SimpleDateFormat(
"yyMMddhhmmss"
);
int
rand =
new
Random().nextInt(1000);
String numberName = format.format(
new
Date()) + rand;
return
getNewFileName(fileName, numberName,
"txt"
);
}
/**
* <b>function:</b>判断该文件是否存在
* @author hoojo
* @createDate Oct 10, 2010 12:00:44 AM
* @param fileName 文件名称
* @param path 目录
* @return 是否存在
*/
public
static
boolean
isFileExist(String fileName, String path) {
File file =
new
File(getDoPath(path) + fileName);
return
file.exists();
}
/**
* <b>function:</b>返回可用的文件名
* @author hoojo
* @createDate Oct 10, 2010 1:02:45 AM
* @param fileName 文件名
* @param path 路径
* @return 可用文件名
*/
public
static
String getBracketFileName(String fileName, String path) {
return
getBracketFileName(fileName, fileName, path, 1);
}
/**
* <b>function:</b>递归处理文件名称,直到名称不重复(对文件名、目录文件夹都可用)
* eg: a.txt --> a(1).txt
* 文件夹upload--> 文件夹upload(1)
* @author hoojo
* @createDate Oct 10, 2010 12:56:27 AM
* @param fileName 文件名称
* @param path 文件路径
* @param num 累加数字,种子
* @return 返回没有重复的名称
*/
public
static
String getBracketFileName(String fileName, String bracketName, String path,
int
num) {
boolean
exist = isFileExist(bracketName, path);
if
(exist) {
int
index = fileName.lastIndexOf(
"."
);
String suffix =
""
;
bracketName = fileName;
if
(index != -1) {
suffix = fileName.substring(index);
bracketName = fileName.substring(0, index);
}
bracketName +=
"("
+ num +
")"
+ suffix;
num++;
bracketName = getBracketFileName(fileName, bracketName, path, num);
}
return
bracketName;
}
/**
* <b>function:</b>处理后的系统文件路径
* @author hoojo
* @createDate Oct 10, 2010 12:49:31 AM
* @param path 文件路径
* @return 返回处理后的路径
*/
public
static
String getDoPath(String path) {
path = path.replace(
"\\", "
/
");
String lastChar = path.substring(path.length() - 1);
if (!"/
".equals(lastChar)) {
path += "/
";
}
return path;
}
/**
* <b>function:</b> 创建指定的path路径目录
* @author hoojo
* @createDate Oct 9, 2010 11:03:49 PM
* @param path 目录、路径
* @return 是否创建成功
* @throws Exception
*/
public static boolean mkDir(String path) throws Exception {
File file = null;
try {
file = new File(path);
if (!file.exists()) {
return file.mkdirs();
}
} catch (RuntimeException e) {
throw e;
} finally {
file = null;
}
return false;
}
/**
* 创建缩略图
* @param file 上传的文件流
* @param height 最小的尺寸
* @throws IOException
*/
/*public static void writeBrevityPic(File file, float width, float height) throws IOException {
Image src = javax.imageio.ImageIO.read(file); // 构造Image对象
int old_w = src.getWidth(null); // 得到源图宽
int old_h = src.getHeight(null);
int new_w = 0;
int new_h = 0; // 得到源图长
float tempdouble;
if (old_w >= old_h) {
tempdouble = old_w / width;
} else {
tempdouble = old_h / height;
}
if (old_w >= width || old_h >= height) { // 如果文件小于锁略图的尺寸则复制即可
new_w = Math.round(old_w / tempdouble);
new_h = Math.round(old_h / tempdouble);// 计算新图长宽
while (new_w > width && new_h > height) {
if (new_w > width) {
tempdouble = new_w / width;
new_w = Math.round(new_w / tempdouble);
new_h = Math.round(new_h / tempdouble);
}
if (new_h > height) {
tempdouble = new_h / height;
new_w = Math.round(new_w / tempdouble);
new_h = Math.round(new_h / tempdouble);
}
}
BufferedImage tag = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src, 0, 0, new_w, new_h, null); // 绘制缩小后的图
FileOutputStream newimage = new FileOutputStream(file); // 输出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(tag);
param.setQuality((float) (100 / 100.0), true);// 设置图片质量,100最大,默认70
encoder.encode(tag, param);
encoder.encode(tag); // 将JPEG编码
newimage.close();
}
}*/
public static void main(String[] args) throws Exception {
String path = "F:/Example Exercise/ExtJS/MultiUpload/WebRoot/upload
";
//System.out.println(mkDir(path));
System.out.println(getDoPath(path));
System.out.println(getBracketFileName("a.txt
", getDoPath(path)));
System.out.println(getNumberName("a.jpg
"));
System.out.println(getNumberName("a.jpg
"));
System.out.println(getNewFileName("a
", "
bbb
", "
txt
"));
System.out.println(getRandomName("a.htm
"));
System.out.println(getSuffix("a.jpg
"));
System.out.println(getType("a.jpg
"));
//List<File> list = getFiles(path);
//List<File> list = getFiles(path, "xml
");
//List<File> list = getFiles(path, typeImages);
//List<File> list = getFiles(path, typeOthers);
//List<File> list = getFiles(path, typeImages, false);
/*List<File> list = getFiles(path, "GIF
", true);
for (File f : list) {
System.out.println("Name:
" + f.getName());
System.out.println(f.getAbsolutePath() + "#
" + f.getPath());
}*/
System.out.println(removeFile("a.txt
", path));
System.out.println("#############################################
");
System.out.println("###
" + validTypeByName("
a
", new String[]{"
*
"}));
System.out.println("###
" + validTypeByName("
a.JPG
", typeImages));
System.out.println("###
" + validTypeByName("
a.JPG
", typeImages, false));
System.out.println(validTypeByPostfix("cals
", new String[]{"
*
", "
b
"}));
System.out.println(validTypeByPostfix("b
", new String[]{"
cal
", "
B"}, false));
}
}

