`
hekuilove
  • 浏览: 158936 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

笔记:将FileItem存放于缓存

 
阅读更多
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;

import org.apache.commons.fileupload.FileItem;

/**
 * 
 * @ClassName: FileItemHelper
 * @description: 存放临时文件,此类仅支持文件较小,并且存放时间极短的文件,除此类型的文件请存放于硬盘。
 * @author: QUINN
 * @date: 2014年6月4日 上午10:47:53
 * @version: V1.0
 * 
 */
public class FileItemHelper {

	private FileItemHelper() {

	}

	// 临时文件存放时间 超时4分钟
	private final int TIMEOUT = 1000 * 60 * 4;

	private boolean isCheck = false;

	private static FileItemHelper INSTANCE;

	public static FileItemHelper getInstance() {
		if (FileItemHelper.INSTANCE == null) {
			synchronized (sync) {
				if (FileItemHelper.INSTANCE == null)
					FileItemHelper.INSTANCE = new FileItemHelper();
			}
		}
		return FileItemHelper.INSTANCE;
	}

	// 线程锁对象
	private static Object sync = 1;

	public String putItem(FileItem item) {
		synchronized (sync) {
			String uuid = UUID.randomUUID().toString().replace("-", "");
			datas.put(uuid, item);
			timeouts.put(uuid, System.currentTimeMillis());
			isCheck = true;
			this.checkThread.start();
			return uuid;
		}
	}

	private Thread checkThread = new Thread() {
		public void run() {
			while (true) {
				if (isCheck)
					synchronized (sync) {
						if (timeouts.isEmpty()) {
							isCheck = false;
							break;
						}
						long now = System.currentTimeMillis();
						Iterator<String> ite = timeouts.keySet().iterator();
						while (ite.hasNext()) {
							String key = ite.next();
							long time = timeouts.get(key);
							if (now - time > TIMEOUT) {
								datas.remove(key);
								ite.remove();
							}
						}
					}

				try {
					Thread.sleep(5 * 1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
	};

	/**
	 * 
	 * 
	 * @Title: getFileItem
	 * @Description: 获取了FileItem后会自动删除
	 * @param: <p>
	 * @param key
	 * @param: <p>
	 * @return <p>
	 * @date: 2014年6月4日
	 * @return: FileItem
	 * @throws
	 * 
	 */
	public FileItem getFileItem(String key) {
		synchronized (sync) {
			FileItem item = this.datas.get(key);
			this.datas.remove(key);
			this.timeouts.remove(key);
			if (timeouts.isEmpty())
				this.isCheck = false;

			return item;
		}
	}

	// 存文件
	private Map<String, FileItem> datas = new HashMap<String, FileItem>();
	// 超时时间
	private Map<String, Long> timeouts = new HashMap<String, Long>();


}

分享到:
评论

相关推荐

    浅谈FileItem类的常用方法

    5. `getString()`: 此方法将FileItem的内容转化为字符串,有两个重载版本,一个默认使用系统默认编码,另一个接受指定的字符集编码。在处理包含非ASCII字符(如中文)的表单字段时,应使用带编码参数的版本,以避免...

    实现上传与下载所需文件

    6. 保存文件:将FileItem写入服务器的指定目录,或者转换为InputStream/OutputStream进行进一步处理。 在文件下载方面,通常通过Servlet或Controller创建一个响应流,读取服务器上存储的文件内容并发送到客户端。...

    commons fileupload实现文件上传

    对于文件类型的`FileItem`,可以调用`write()`方法将其保存到服务器指定位置。 6. **与Struts框架集成**:在Struts框架中,可以利用FileUpload与ActionForm结合,处理用户上传的文件。需要在struts-config.xml中...

    VC文件上传和FT实现.pdf

    void CMyFtpDlg::DownFile(FILEITEM fileItem) { if (fileItem.bDir == TRUE) { // 暂时不支持下载整个文件夹 AfxMessageBox(_T("暂时不支持下载整个文件夹,请选择文件下载")); } else { CString ...

    FileUploadAndDownloadDemo.rar

    当文件上传时,如果内存不足以存放整个文件,`DiskFileItemFactory`会将文件部分或全部写入到磁盘上,确保上传过程的稳定性和效率。 3. **ServletFileUpload**: `ServletFileUpload`是另一个Apache Commons ...

    commons-fileupload-1.2.1-bin.zip

    `lib`目录存放了依赖的库文件,如`commons-io-1.4.jar`,它是FileUpload组件依赖的Apache Commons IO库。`src`目录则包含了源代码,开发者可以查看并理解其内部实现。 2. **工作原理**:FileUpload通过分析HTTP请求...

    java文件上传commons-fileupload用户指南

    2. **FileUpload**: 这个类提供了解析多部分请求数据的方法,可以将整个请求分解为多个`FileItem`对象。 3. **FileItem**: `FileItem`对象表示上传的一个部分,可能是普通表单字段或者上传的文件。它提供了读取和...

    09_尚硅谷_文件的上传和下载_王振国 - 课堂笔记1

    文件上传和下载技术是指用户将文件从客户端上传到服务器端,或者从服务器端下载到客户端的过程。 文件上传的介绍 文件上传是指用户将文件从客户端上传到服务器端的过程。文件上传需要满足以下四个条件: 1. 需要...

    commons-fileupload-1.4-bin.zip

    Apache Commons FileUpload库是Java Web开发中不可或缺的一部分,它简化了文件上传操作,使得开发者能够更专注于业务逻辑,而非底层细节。通过理解其工作原理和正确使用方式,可以更好地应对实际项目中的文件上传...

    comm-fileupload教程

    在这个教程中,我们将专注于如何使用 `comm-fileupload` 来实现文件上传功能。 1. **基本概念** - **FileUploadBase.java**: 这是教程中提到的一个抽象基类,它封装了 Apache Commons FileUpload 的核心功能,并...

    commons-fileupload-1.2.2.zip

    2.1 下载:从Apache官方网站下载commons-fileupload-1.2.2.jar,同时由于该库依赖于commons-io库,也需要下载对应的commons-io-*.jar。 2.2 集成:将这两个JAR文件加入到项目的类路径中,如果是Maven项目,可以在...

    java upload file demo

    5. **ServletFileUpload**:这个类是FileUpload库的一部分,它可以解析multipart请求,并将每个部分转换为`FileItem`实例。 6. **FileItem接口**:`FileItem`提供了访问上传文件内容的方法,如`write()`用于写入...

    commons-fileupload-1.3.1-src.tar.gz

    FileUpload库负责解析这种格式的数据,将其拆分为单独的文件和普通表单字段,然后将它们封装成`FileItem`对象供应用程序处理。每个`FileItem`对象代表一个表单字段,无论是文本还是文件。 3. **使用步骤** 使用...

    java网页上传文件包commons-fileupload.jar

    2. **DiskFileItem**: `FileItem`的一个实现,它将上传数据存储在磁盘上,以防止内存溢出。当上传文件较大时,这是一个很好的选择。 3. **FileUpload**: 这是主要的处理类,用于解析HTTP请求的多部分数据。`...

    DiskFileItemFactory需要的jar包commons-fileupload-1.3.jar和commons-io-1.2.jar(文件上传)

    5. **处理FileItem**:遍历FileItem对象,如果是文件,使用FileItem的write()方法将其写入服务器指定的路径;如果是普通表单字段,读取其值进行业务处理。 6. **清理**:处理完成后,删除临时文件,释放资源。 这两...

    org.apache.commons.fileupload

    ServletFileUpload能够解析这种格式,将每个部分(可能是文本字段或文件)转换为`FileItem`。 5. **安全性与配置**: 使用FileUpload时,需要考虑安全性问题,如限制文件大小以防止DoS攻击,验证文件类型以避免恶意...

    commons-fileupload上传组件

    4. **文件处理**:`FileItem`接口提供了读取文件内容的方法,如`write()`方法可以将文件保存到服务器上的指定位置。此外,`delete()`方法可用于清理临时文件。 5. **安全性考虑**:使用FileUpload时,开发者需要...

    java web 学习笔记,超详细好用.docx

    Java Web 学习笔记主要涉及了文件上传这一关键知识点,这是在开发Web应用程序时常见的功能,比如用户上传头像、图片或附件等。文件上传在HTML表单中通过特定的方式实现,包括以下几点: 1. **表单提交方式**:为了...

    apche Commons

    - **关键类**:`FileItem`、`FileItemFactory` 和 `ServletFileUpload` 等,`FileItem` 代表上传的单一文件或字段,`FileItemFactory` 用于创建 `FileItem` 实例,而 `ServletFileUpload` 是解析多部分HTTP请求的...

Global site tag (gtag.js) - Google Analytics