从Apache Commons FileUpload 1.2.2迁移至2.0.0-M2遇类废弃问题求助
Apache Commons FileUpload 2.0.0-M2迁移错误修复方案
Apache Commons FileUpload 2.x版本做了大量API重构,包括泛型化改造、构造方式切换为Builder模式,这是你遇到错误的核心原因。以下是针对性的修复方案:
核心错误修正点
- FileItemFactory泛型参数化:2.x版本中
FileItemFactory是泛型接口,必须指定具体的FileItem实现类(比如磁盘存储对应的DiskFileItem)。 - DiskFileItemFactory构造方式变更:无参构造被移除,改用Builder模式创建实例,支持灵活配置临时文件阈值、存储目录等参数。
- 代码隐性错误修正:修正
List泛型拼写、parseRequest方法名大小写及参数错误,优化Iterator泛型避免强制类型转换。
修正后的完整代码
import org.apache.commons.fileupload2.core.DiskFileItem; import org.apache.commons.fileupload2.core.DiskFileItemFactory; import org.apache.commons.fileupload2.core.FileItem; import org.apache.commons.fileupload2.core.FileItemFactory; import org.apache.commons.fileupload2.javax.JavaxServletFileUpload; // some code protected FileItem getFileItem(HttpRequest request) { FileItem file = null; // 使用Builder模式创建工厂实例,可按需配置参数 FileItemFactory<DiskFileItem> factory = DiskFileItemFactory.builder() // 可选:设置内存存储阈值,超过则写入临时文件(示例为1MB) .setFileSizeThreshold(1024 * 1024) // 可选:指定临时文件存储目录 // .setRepository(new File(System.getProperty("java.io.tmpdir"))) .get(); JavaxServletFileUpload upload = new JavaxServletFileUpload(factory); // 修正泛型和方法调用错误 List<FileItem> items = upload.parseRequest(request); Iterator<FileItem> iter = items.iterator(); while (iter.hasNext()) { FileItem item = iter.next(); // 这里添加你的业务逻辑,比如判断是否为文件项 // if (!item.isFormField()) { ... } file = item; } return file; }
额外说明
- 如需流式处理上传文件,可使用
JavaxServletFileUpload.getItemIterator(request)方法,替代旧版的FileItemStreamFactory相关逻辑; JavaxServletFileUpload是2.x版本中专门适配Java Servlet环境的上传处理器,对应旧版的ServletFileUpload类。
内容的提问来源于stack exchange,提问作者GregV
相关产品推荐
相关产品推荐

