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>();
}
分享到:
相关推荐
5. `getString()`: 此方法将FileItem的内容转化为字符串,有两个重载版本,一个默认使用系统默认编码,另一个接受指定的字符集编码。在处理包含非ASCII字符(如中文)的表单字段时,应使用带编码参数的版本,以避免...
6. 保存文件:将FileItem写入服务器的指定目录,或者转换为InputStream/OutputStream进行进一步处理。 在文件下载方面,通常通过Servlet或Controller创建一个响应流,读取服务器上存储的文件内容并发送到客户端。...
对于文件类型的`FileItem`,可以调用`write()`方法将其保存到服务器指定位置。 6. **与Struts框架集成**:在Struts框架中,可以利用FileUpload与ActionForm结合,处理用户上传的文件。需要在struts-config.xml中...
void CMyFtpDlg::DownFile(FILEITEM fileItem) { if (fileItem.bDir == TRUE) { // 暂时不支持下载整个文件夹 AfxMessageBox(_T("暂时不支持下载整个文件夹,请选择文件下载")); } else { CString ...
当文件上传时,如果内存不足以存放整个文件,`DiskFileItemFactory`会将文件部分或全部写入到磁盘上,确保上传过程的稳定性和效率。 3. **ServletFileUpload**: `ServletFileUpload`是另一个Apache Commons ...
`lib`目录存放了依赖的库文件,如`commons-io-1.4.jar`,它是FileUpload组件依赖的Apache Commons IO库。`src`目录则包含了源代码,开发者可以查看并理解其内部实现。 2. **工作原理**:FileUpload通过分析HTTP请求...
2. **FileUpload**: 这个类提供了解析多部分请求数据的方法,可以将整个请求分解为多个`FileItem`对象。 3. **FileItem**: `FileItem`对象表示上传的一个部分,可能是普通表单字段或者上传的文件。它提供了读取和...
文件上传和下载技术是指用户将文件从客户端上传到服务器端,或者从服务器端下载到客户端的过程。 文件上传的介绍 文件上传是指用户将文件从客户端上传到服务器端的过程。文件上传需要满足以下四个条件: 1. 需要...
Apache Commons FileUpload库是Java Web开发中不可或缺的一部分,它简化了文件上传操作,使得开发者能够更专注于业务逻辑,而非底层细节。通过理解其工作原理和正确使用方式,可以更好地应对实际项目中的文件上传...
在这个教程中,我们将专注于如何使用 `comm-fileupload` 来实现文件上传功能。 1. **基本概念** - **FileUploadBase.java**: 这是教程中提到的一个抽象基类,它封装了 Apache Commons FileUpload 的核心功能,并...
2.1 下载:从Apache官方网站下载commons-fileupload-1.2.2.jar,同时由于该库依赖于commons-io库,也需要下载对应的commons-io-*.jar。 2.2 集成:将这两个JAR文件加入到项目的类路径中,如果是Maven项目,可以在...
5. **ServletFileUpload**:这个类是FileUpload库的一部分,它可以解析multipart请求,并将每个部分转换为`FileItem`实例。 6. **FileItem接口**:`FileItem`提供了访问上传文件内容的方法,如`write()`用于写入...
FileUpload库负责解析这种格式的数据,将其拆分为单独的文件和普通表单字段,然后将它们封装成`FileItem`对象供应用程序处理。每个`FileItem`对象代表一个表单字段,无论是文本还是文件。 3. **使用步骤** 使用...
2. **DiskFileItem**: `FileItem`的一个实现,它将上传数据存储在磁盘上,以防止内存溢出。当上传文件较大时,这是一个很好的选择。 3. **FileUpload**: 这是主要的处理类,用于解析HTTP请求的多部分数据。`...
5. **处理FileItem**:遍历FileItem对象,如果是文件,使用FileItem的write()方法将其写入服务器指定的路径;如果是普通表单字段,读取其值进行业务处理。 6. **清理**:处理完成后,删除临时文件,释放资源。 这两...
ServletFileUpload能够解析这种格式,将每个部分(可能是文本字段或文件)转换为`FileItem`。 5. **安全性与配置**: 使用FileUpload时,需要考虑安全性问题,如限制文件大小以防止DoS攻击,验证文件类型以避免恶意...
4. **文件处理**:`FileItem`接口提供了读取文件内容的方法,如`write()`方法可以将文件保存到服务器上的指定位置。此外,`delete()`方法可用于清理临时文件。 5. **安全性考虑**:使用FileUpload时,开发者需要...
Java Web 学习笔记主要涉及了文件上传这一关键知识点,这是在开发Web应用程序时常见的功能,比如用户上传头像、图片或附件等。文件上传在HTML表单中通过特定的方式实现,包括以下几点: 1. **表单提交方式**:为了...
- **关键类**:`FileItem`、`FileItemFactory` 和 `ServletFileUpload` 等,`FileItem` 代表上传的单一文件或字段,`FileItemFactory` 用于创建 `FileItem` 实例,而 `ServletFileUpload` 是解析多部分HTTP请求的...