整了一个工具类,简化文件上传的一些基本操作。(基于common-fileupload)

4 篇文章 0 订阅
2 篇文章 0 订阅
一般常用的有三种上传组件是用的比较多的有三种。

参考:[url]http://www.oschina.net/question/1_4442[/url] 三种文件的比较

自己整了个文件上传的工具类。整合文件类型检查,缓冲相关的设置,文件保存策略,和普通表单域封装。

贴下代码,有好意见和改进的欢迎评论。

用的是最常用的common-uploadfile

接口:



import java.io.File;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

/**
* 文件上传通用接口
*
* fileType :限制的文件类型。 fileSize :限制的文件大小,默认5M,-1就是无限制大小
*

*
* crateFilePolicy : 文件创建策略,为true的话,根据url没有路径一直创建,默认启用 。 fileOverPolicy
* :文件覆盖策略,为true的话,相同文件不会覆盖将会改名字,默认不启用。
* <p>
* cachePathString :缓冲区文件夹 cacheSize缓冲区大小,默认5M。
*

*
* @author fule
* @Time 2012 - 7 - 23
*
*/
public interface FileUploadModule {
/**
* 一兆的大小
*/
long TRILLION = 1024 * 1024;
/**
* 文件限制性的大小(默认的5M)
*/
long DEFAULT_SIZE = TRILLION * 5;
/**
* 启用
*/
boolean ENABLE = true;
/**
* 不启用
*/
boolean DISABLE = false;

/**
* 设置文件上传的类型
*
* @param type
*/
void setFileType(String[] type);

/**
* 设置缓存区磁盘位置,如果文件比较大,建议设置缓冲
*
* @param cachePathString
*/
void setCachePathString(String cachePathString);

/**
* 设置缓存区大小,默认的为5M
*
* @param cacheSize
*/
void setCacheSize(long cacheSize);


public void setFileSize(long fileSize);

/**
* 得到文件类型
*
* @param file
* @return
*/
public String getFileExt(File file);

/**
* 文件类型检查 当fileType为空将返回true 可通过setFileType()设置文件类型
*
* @see FileUploadUtil 的 fileType属性
* @param file
* 传入的文件
* @return 是否为指定类型(true)
*/
public boolean validateFileType(File file);

/**
* 递归的根据路径创建文件夹
*
* @param url
* @return
* @throws Exception
*/

public boolean createFolder(String url) throws Exception;

/**
* 创建文件副本
*
* @param file
* @return
*/
public File createCopyFile(File file);

/**
* 文件上传 参数urlString是具体指定的目录
*
* 如果该对象属性值为空 ,将不使用缓存,无文件类型限制,上传大小默认为5M,目录规则默认为没有目录递归创建,相同文件名将覆盖源文件
* 如需改变通过设置属性来改变
*

* 此方法如文件上传错误或者文件类型不匹配将抛出异常
*
* @param request
* 当前请求
* @param urlString
* urlString是具体指定的目录
* @throws Exception
*/
public void uploadFiles(HttpServletRequest request, String urlString)
throws Exception;

/**
* 获得普通表单域的值
* @return
*/
public Map<String, String> getFormMap();
}



实现类

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;

/**
* 文件上传工具类
*
* @Time 2012 - 7 - 23
* @author fule
*
* fileType :限制的文件类型。 fileSize :限制的文件大小,默认5M,-1就是无限制大小
*

*
* crateFilePolicy : 文件创建策略,为true的话,根据url没有路径一直创建,默认启用 。 fileOverPolicy
* :文件覆盖策略,为true的话,相同文件不会覆盖将会改名字,默认不启用。
* <p>
* cachePathString :缓冲区文件夹 cacheSize缓冲区大小,默认5M。
*

*/
public class FileUploadUtil implements FileUploadModule {

// 限制的文件类型
private String[] fileType;

// 限制的文件大小,默认5M,-1就是无限制大小
private long fileSize = DEFAULT_SIZE;

// 设置文件创建策略,为true的话,根据url没有路径一直创建,默认启用
private boolean crateFilePolicy = ENABLE;

// 设置文件覆盖策略,为true的话,相同文件不会覆盖将会改名字,默认不启用
private boolean fileOverPolicy = DISABLE;

// 设置缓冲区文件夹
private String cachePathString;

// 设置缓冲区大小,默认5M
private long cacheSize = DEFAULT_SIZE;

// 文件上传处理类
private ServletFileUpload sfu;

// 磁盘工厂
private DiskFileItemFactory factory = new DiskFileItemFactory();

// 表单域的值
private Map<String, String> formMap;

public FileUploadUtil() {
}

public FileUploadUtil(String[] fileType, long fileSize,
boolean crateFilePolicy, boolean fileOverPolicy,
String cachePathString, long cacheSize) {
super();
this.fileType = fileType;
this.fileSize = fileSize;
this.crateFilePolicy = crateFilePolicy;
this.fileOverPolicy = fileOverPolicy;
this.cachePathString = cachePathString;
this.cacheSize = cacheSize;
}

public FileUploadUtil(String[] fileType, long fileSize,
boolean crateFilePolicy, boolean fileOverPolicy) {
super();
this.fileType = fileType;
this.fileSize = fileSize;
this.crateFilePolicy = crateFilePolicy;
this.fileOverPolicy = fileOverPolicy;
}

public FileUploadUtil(String[] fileType, long fileSize) {
super();
this.fileType = fileType;
this.fileSize = fileSize;
}

public Map<String, String> getFormMap() {
return formMap;
}

public void setFormMap(Map<String, String> formMap) {
this.formMap = formMap;
}

public String getCachePathString() {
return cachePathString;
}

public void setCachePathString(String cachePathString) {
this.cachePathString = cachePathString;
}

public long getCacheSize() {
return cacheSize;
}

public void setCacheSize(long cacheSize) {
this.cacheSize = cacheSize;
}

public boolean isFileOverPolicy() {
return fileOverPolicy;
}

public void setFileOverPolicy(boolean fileOverPolicy) {
this.fileOverPolicy = fileOverPolicy;
}

public boolean isCrateFilePolicy() {
return crateFilePolicy;
}

public void setCrateFilePolicy(boolean crateFilePolicy) {
this.crateFilePolicy = crateFilePolicy;
}

public long getFileSize() {
return fileSize;
}

public void setFileSize(long fileSize) {
this.fileSize = fileSize;
}

public void setFileType(String[] fileType) {

this.fileType = fileType;
}

public String[] getFileType() {
return fileType;
}

public ServletFileUpload getServletFileUpload() {
if (sfu == null) {

return sfu = new ServletFileUpload(factory);
} else {
return sfu;
}
}

/**
* // 得到文件类型
*
* @param file
* @return
*/
public String getFileExt(File file) {
return file.getName().substring(file.getName().lastIndexOf(".") + 1);
}

/**
* 检查文件类型
*
* @param fileType
* 需要文件类型
* @param file
* 传入的文件
* @return 是否为指定类型(true)
*/
public boolean validateFileType(File file) {
if (fileType == null) {
return true;
}
for (int i = 0, len = fileType.length; i < len; i++) {
if (fileType[i].equals(getFileExt(file))) {
return true;
}
}
return false;
}

/**
* 递归的根据路径创建文件夹
*
* @param url
* @return
* @throws Exception
*/

public boolean createFolder(String url) throws Exception {
boolean boo = true;
// String path = url.substring(0, url.lastIndexOf("\\"));
File file = new File(url);
if (!file.exists()) {
if (!file.mkdirs()) {
boo = false;
throw new Exception("文件夹创建失败");
}
}
return boo;
}

/**
* 创建文件副本
*
* @param file
* @return
*/
public File createCopyFile(File file) {
String name = file.getName().substring(0, file.getName().indexOf("."));
String basePath = file.getPath().substring(0, file.getPath().lastIndexOf("\\")+1);
if (name.lastIndexOf("1") != -1) {
String b = name.substring(0, name.lastIndexOf("1"));
String bString = name.substring(name.lastIndexOf("1"));
int a = Integer.valueOf(bString);
name = b + String.valueOf((a + 1));
} else {
name += "1";
}
return new File(basePath+name+"."+ getFileExt(file));
}

/**
* 文件上传 参数urlString是具体指定的目录 如果该对象属性值为空
* 将不使用缓存,无文件类型限制,上传大小默认为5M,目录规则默认为没有目录递归创建 相同文件名将覆盖源文件
* 此方法如文件上传错误或者文件类型不匹配将抛出异常
*
* @param request
* 当前请求
* @param urlString
* urlString是具体指定的目录
* @throws Exception
*/
@SuppressWarnings("unchecked")
public void uploadFiles(HttpServletRequest request, String urlString)
throws Exception {
if (!ServletFileUpload.isMultipartContent(request))
return;
if (crateFilePolicy) {
createFolder(urlString);
createFolder(getCachePathString());
}
ServletFileUpload sfu = getServletFileUpload();
sfu.setFileSizeMax(fileSize);
if (cachePathString != null) {
factory.setRepository(new File(cachePathString));
factory.setSizeThreshold((int) cacheSize);
}
List<FileItem> items = sfu.parseRequest(request);
Map<String, String> map = new HashMap<String, String>();
if (!fileOverPolicy) {
for (FileItem ft : items) {
if (!ft.isFormField()) {
File file = new File(urlString,
new File(ft.getName()).getName());
if (fileType != null) {
if (validateFileType(file)) {
ft.write(file);
} else {
throw new Exception("文件类型错误");
}
} else {
ft.write(file);
}
ft.delete();
} else {
map.put(ft.getFieldName(), ft.getString("utf-8"));
}
}
} else {
for (FileItem ft : items) {
if (!ft.isFormField()) {
File file = new File(urlString,
new File(ft.getName()).getName());
if (fileType != null) {
if (validateFileType(file)) {
ft.write(createCopyFile(file));
} else {
throw new Exception("文件类型错误");
}
} else {
ft.write(createCopyFile(file));

}
ft.delete();
} else {
map.put(ft.getFieldName(), ft.getString("utf-8"));
}
}
}
setFormMap(map);//设置表单域的值
}
}



测试:
SpringMVC中action代码:

/**
* 测试工具类
* @param request
*/
@RequestMapping("testUtil.do")
public void testFileUtil(HttpServletRequest request) {
FileUploadModule fu = new FileUploadUtil();
fu.setCachePathString(request.getSession().getServletContext()
.getRealPath(("/"))
+ "images/temp");
fu.setFileType(new String[]{"jpg","gif","txt"});
fu.setFileOverPolicy(FileUploadModule.ENABLE);
try {
fu.uploadFiles(request, request.getSession().getServletContext()
.getRealPath(("/")+"images/test"));
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
Map<String,String> mp = fu.getFormMap();
Set<String> key = mp.keySet();
//Object[] object =key.toArray();
for(String s:key){
System.out.println("表单名称:"+s);
System.out.println("表单值:"+mp.get(s));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


希望大家给下意见。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值