整了一个工具类,简化文件下传的一些基本操作。(基于common-fileupload)
整了一个工具类,简化文件上传的一些基本操作。(基于common-fileupload)
一般常用的有三种上传组件是用的比较多的有三种。
参考:http://www.oschina.net/question/1_4442 三种文件的比较
自己整了个文件上传的工具类。整合文件类型检查,缓冲相关的设置,文件保存策略,和普通表单域封装。
贴下代码,有好意见和改进的欢迎评论。
用的是最常用的common-uploadfile
接口:
实现类
测试:
SpringMVC中action代码:
希望大家给下意见。
除非文件名中含有.,如 s.s.txt,就不行了。改下就可以了
smartupload 性能不高
一般常用的有三种上传组件是用的比较多的有三种。
参考:http://www.oschina.net/question/1_4442 三种文件的比较
自己整了个文件上传的工具类。整合文件类型检查,缓冲相关的设置,文件保存策略,和普通表单域封装。
贴下代码,有好意见和改进的欢迎评论。
用的是最常用的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(); } }
希望大家给下意见。
1 楼
denvelope
2012-07-23
用struts2框架就不用这么麻烦了。
2 楼
xutao5641745
2012-07-23
/**
* // 得到文件类型
*
* @param file
* @return
*/
public String getFileExt(File file) {
return file.getName().substring(file.getName().indexOf(".") + 1);
}
这种方式得到的文件类型,,,不一定真实吧?
* // 得到文件类型
*
* @param file
* @return
*/
public String getFileExt(File file) {
return file.getName().substring(file.getName().indexOf(".") + 1);
}
这种方式得到的文件类型,,,不一定真实吧?
3 楼
lohasle
2012-07-23
xutao5641745 写道
/**
* // 得到文件类型
*
* @param file
* @return
*/
public String getFileExt(File file) {
return file.getName().substring(file.getName().indexOf(".") + 1);
}
这种方式得到的文件类型,,,不一定真实吧?
* // 得到文件类型
*
* @param file
* @return
*/
public String getFileExt(File file) {
return file.getName().substring(file.getName().indexOf(".") + 1);
}
这种方式得到的文件类型,,,不一定真实吧?
除非文件名中含有.,如 s.s.txt,就不行了。改下就可以了
public String getFileExt(File file) { return file.getName().substring(file.getName().lastIndexOf(".") + 1); }
4 楼
234369425
2012-07-23
Apache的smartupload
5 楼
lohasle
2012-07-24
234369425 写道
Apache的smartupload
smartupload 性能不高