`
lohasle
  • 浏览: 254684 次
社区版块
存档分类
最新评论

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

阅读更多
一般常用的有三种上传组件是用的比较多的有三种。

参考: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();
		}
	}


希望大家给下意见。
2
8
分享到:
评论
5 楼 lohasle 2012-07-24  
234369425 写道
Apache的smartupload

smartupload  性能不高
4 楼 234369425 2012-07-23  
Apache的smartupload
3 楼 lohasle 2012-07-23  
xutao5641745 写道
/**
     * // 得到文件类型
     * 
     * @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);  
    }  
2 楼 xutao5641745 2012-07-23  
/**
     * // 得到文件类型
     * 
     * @param file
     * @return
     */ 
    public String getFileExt(File file) { 
        return file.getName().substring(file.getName().indexOf(".") + 1); 
    } 

这种方式得到的文件类型,,,不一定真实吧?
1 楼 denvelope 2012-07-23  
用struts2框架就不用这么麻烦了。

相关推荐

    最全的common-FileUpload.jar包

    另一个重要的库是"Commons-IO.jar",它是Apache Commons的另一个组件,提供了一系列与I/O操作相关的实用工具类。在文件上传过程中,它可以帮助我们进行文件的读写、复制、删除等操作。例如,`FileUtils`类提供了静态...

    common-io,common-fileupload.jar等jar包

    这些库包含了处理输入/输出(I/O)、文件上传(FileUpload)等常见任务的工具类和接口。下面将详细阐述`common-io`和`common-fileupload`这两个关键组件的主要功能和知识点。 1. **Apache Commons IO** (`common-io...

    commons-fileupload-1.3.3.jar和commons-io-2.6.jar

    在Java开发中,上传文件是一项常见的任务,而`commons-fileupload-1.3.3.jar`和`commons-io-2.6.jar`是Apache Commons项目中的两个重要库,专门用于处理HTTP请求中的文件上传功能。这两个库为开发者提供了便捷、高效...

    common-fileupload文件上传及下载

    `common-fileupload`是Apache Commons项目的一部分,提供了一套完善的Java API,用于处理HTTP协议中的文件上传操作。这个库简化了从用户提交的表单中提取并处理文件数据的过程。 1. **文件上传流程** - 用户在Web...

    java中common-fileupload 上传文件demo

    `Commons IO`库是`Commons FileUpload`依赖的,因为它包含了处理I/O操作的工具类。 接下来,我们来看一下使用`Commons FileUpload`实现文件上传的基本步骤: 1. **创建Servlet或Controller**:在Java Web应用中,...

    commons-fileupload-1.2.1.jar 和commons-io-1.4.jar

    `commons-io-1.4.jar`是Apache Commons IO库的一个版本,它包含了大量与I/O操作相关的工具类。这个库是对Java标准库的扩展,提供了一些额外的功能和便利性。在与FileUpload配合使用时,IO库可以用来: 1. **文件...

    commons-fileupload-1.2.2 common-io-2.0.1

    **Apache Commons IO** 是另一个非常有用的库,它提供了一系列与输入/输出操作相关的工具类。2.0.1版本增加了对Java NIO的支持,并且修复了一些已知问题。这个库包括了文件操作(如读写、复制、比较、删除)、I/O...

    上传架包commmon-fileupload common-io

    Apache Commons IO是另一个非常实用的Java库,它提供了大量的I/O操作工具类,涵盖了文件操作、流操作、字符集转换等许多方面。"commons-io-2.4-bin"这个压缩包中包含的则是Commons IO库的二进制版本,以及可能的文档...

    利用commons-fileupload组件实现文件上传-实例

    通过以上步骤,我们就使用Apache Commons FileUpload组件实现了一个基本的文件上传功能。你可以根据自己的需求对这个示例进行扩展,比如添加错误处理、文件类型检查和存储优化等。参考提供的博文链接,可以获取更多...

    java commons-fileupload1.2.2和common-io.1.3.2文件上传总结心得

    Apache Commons IO 是另一个库,虽然在这个场景中未直接使用,但它提供了许多与文件操作相关的实用工具类,如 `FileUtils`,可以方便地完成文件的复制、移动、删除等操作。 总的来说,Apache Commons FileUpload 和...

    commons-fileupload.jar和commons-io.jar

    Apache Commons IO则是另一个实用的Java库,它包含了大量与输入/输出相关的工具类,如文件操作、流操作、读写操作等。在处理文件上传时,Commons IO库可以用来创建、移动、复制或删除文件,读取文件内容,以及进行...

    common fileupload上传组件包

    "Common Fileupload上传组件包"是一个专用于处理Web应用程序中文件上传功能的工具包。这个包包含两个核心组件:`commons-io-1.4.jar`和`commons-fileupload-1.2.1.jar`。这两个组件在实现文件上传过程中扮演着至关...

    IOUtils(commons-io-1.4.jar、commons-fileupload-1.2.1.jar等等)

    - `commons-io-1.4.jar`是Apache Commons IO项目的一个版本,包含了许多I/O相关的实用工具类。这个库提供了解决Java I/O操作中常见问题的类和方法。 - **IOUtils**:这是Apache Commons IO中的核心类,提供了一...

    common fileupload

    总之,Common FileUpload是一个强大且灵活的Java文件上传组件,它为开发人员提供了处理文件上传的便捷工具,无论是在小型项目还是大型企业级应用中都能发挥重要作用。通过合理的配置和适当的错误处理,你可以构建...

    Jakarta Commons使用

    - FTP 客户端:支持 FTP 协议,进行文件上传、下载、删除等操作。 - HTTP 客户端:简化了 HTTP 请求和响应的处理。 - Telnet 客户端:实现 Telnet 协议的客户端功能。 - SMTP 服务器:用于发送邮件。 ### 6. 其他...

    jsp文件上传所需common包

    Apache Commons IO库是另一个常用于Java开发的工具库,它提供了大量的实用工具类,处理各种I/O操作,如读写文件、复制流、处理流、检查文件类型等。在文件上传场景中,IO库可以辅助处理上传后的文件操作,如移动、...

    文件上传和下载需要的jar包

    这也是Apache Commons的一个组件,提供了大量的文件操作相关的工具类。这个库对于处理文件读写、文件复制、文件移动、文件属性检查等任务非常有用。例如,`FileUtils`类提供了静态方法,可以方便地完成文件的复制、...

    common-fileupdate1.2.1.jar and io1.4.jar

    这是Apache Commons项目的一个核心库,提供了大量的实用工具类,用于处理各种I/O操作,包括文件、流、字符集转换、读写操作、缓冲区、行处理等。1.4版本同样可能包含了若干bug修复和功能增强。 在文件上传和下载...

    JAVA文件上传Demo

    Apache Commons IO是Java的一个实用工具库,提供了大量与I/O相关的辅助类,包括文件读写、流操作、字符集转换等。而Apache Commons FileUpload则是专门处理HTTP请求中的多部分数据,即文件上传的组件。它简化了从...

Global site tag (gtag.js) - Google Analytics