Apache Commons FileUpload:简单文件上传教程
Apache Commons FileUpload是一个Java库,专门用于处理HTTP请求中的多部分数据,通常涉及文件上传功能。这个库依赖于Apache Commons IO库,确保可以正确解析和处理上传的数据。 "Apache Commons FileUpload是一个用于处理HTTP请求中多部分数据的Java库,常用于文件上传。它依赖于Apache Commons IO库,提供了方便的API来解析和操作上传的文件和表单数据。" 在使用Apache Commons FileUpload时,你需要将`commons-fileupload.jar`和`commons-io.jar`这两个库添加到你的项目类路径中,通常是WEB-INF\lib目录下。例如,描述中提到的版本是`fileUpload-1.2`和`commons-io-1.3.2.jar`。 文件上传的过程通常包括以下几个步骤: 1. **检查请求类型**:首先,你需要检查HTTP请求是否包含多部分数据,即是否为multipart/form-data类型的表单数据。这可以通过调用`ServletFileUpload.isMultipartContent(request)`方法完成。 2. **创建FileItemFactory**:如果请求是多部分的,你需要创建一个`DiskFileItemFactory`实例,它负责在内存或磁盘上存储上传的文件项。 3. **创建ServletFileUpload**:使用`DiskFileItemFactory`实例创建`ServletFileUpload`对象,该对象将解析请求并返回一个`FileItem`的列表。 4. **解析请求**:通过`ServletFileUpload.parseRequest(request)`解析请求,得到一个`FileItem`列表。每个`FileItem`代表表单的一个字段或上传的文件。 5. **处理FileItems**:遍历`FileItem`列表,对于每个`FileItem`,你可以通过`isFormField()`判断它是否是普通表单字段,如果是,可以调用`getString()`获取其内容;如果不是,代表是上传的文件,可以调用`getName()`获取文件名,并根据需要处理或保存文件。 示例1展示了如何处理一个包含文件上传的简单表单。在`demo1.jsp`中,当用户提交包含文本字段和文件选择字段的表单时,Servlet会检查请求类型,解析表单数据,并打印出文本字段的内容和上传文件的名称。 示例2稍微复杂一些,允许用户上传两个文件。处理这部分数据时,你需要对每个`FileItem`进行相同的操作,但可能需要额外的逻辑来处理多个文件,比如将它们保存到服务器的特定目录。 在实际应用中,你可能还需要考虑错误处理、文件大小限制、文件类型验证等安全性问题。Apache Commons FileUpload库提供了一些配置选项,如设置临时存储路径、最大文件大小和内存阈值,以适应不同的需求和安全策略。
所使用的fileUpload版本为1.2,环境为Eclipse3.3+MyEclipse6.0。FileUpload 是基于 Commons IO的,所以在进入项目前先确定Commons IO的jar包(本文使用commons-io-1.3.2.jar)在WEB-INF\lib下。
此文作示例工程可在文章最后的附件中下载。
示例1
最简单的例子,通过ServletFileUpload静态类来解析Request,工厂类FileItemFactory会对mulipart类的表单中的所有字段进行处理,不只是file字段。getName()得到文件名,getString()得到表单数据内容,isFormField()可判断是否为普通的表单项。
demo1.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>File upload</title>
</head>
<body>
//必须是multipart的表单数据。
<form name="myform" action="demo1.jsp" method="post"
enctype="multipart/form-data">
Your name: <br>
<input type="text" name="name" size="15"><br>
File:<br>
<input type="file" name="myfile"><br>
<br>
<input type="submit" name="submit" value="Commit">
</form>
</body>
</html>
demo1.jsp
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.servlet.*"%>
<%@ page import="java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
boolean isMultipart = ServletFileUpload.isMultipartContent(request);//检查输入请求是否为multipart表单数据。
if (isMultipart == true) {
FileItemFactory factory = new DiskFileItemFactory();//为该请求创建一个DiskFileItemFactory对象,通过它来解析请求。执行解析后,所有的表单项目都保存在一个List中。
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> itr = items.iterator();
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
//检查当前项目是普通表单项目还是上传文件。
if (item.isFormField()) {//如果是普通表单项目,显示表单内容。
String fieldName = item.getFieldName();
if (fieldName.equals("name")) //对应demo1.html中type="text" name="name"
out.print("the field name is" + item.getString());//显示表单内容。
out.print("<br>");
} else {//如果是上传文件,显示文件名。
out.print("the upload file name is" + item.getName());
out.print("<br>");
}
}
} else {
out.print("the enctype must be multipart/form-data");
}
%>
<html>
<head>
剩余10页未读,继续阅读
- 粉丝: 1
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦