在Java Web开发中,Servlet是一种用于扩展服务器功能的Java类,它可以处理HTTP请求并返回响应。在本场景中,我们关注的是使用Servlet进行文件上传的功能。`commons-fileupload-1.2`是Apache Commons FileUpload库的一个版本,它是Java中处理文件上传的常见工具,能够方便地将用户通过表单提交的文件数据解析出来。
### Servlet文件上传基础
1. **Servlet生命周期**:Servlet的生命周期包括加载、初始化、服务、销毁四个阶段。在文件上传中,我们通常在初始化阶段配置Servlet,使其准备好处理文件上传请求。
2. **HTTP请求与POST方法**:文件上传通常通过HTTP协议的POST请求来实现。POST请求可以携带大量数据,包括文件内容。
3. **Multipart/form-data编码**:在HTML表单中,文件上传需要设置`enctype="multipart/form-data"`,这样才能正确传输文件内容。
### 使用Apache Commons FileUpload库
1. **依赖引入**:你需要在项目中添加`commons-fileupload-1.2`和`commons-io`的依赖,这两个库提供了文件上传所需的工具和功能。
2. **创建Servlet**:创建一个Servlet,重写`doPost`方法以处理POST请求。在这个方法中,我们需要解析请求的多部分数据。
3. **解析请求**:使用`FileItemFactory`创建工厂对象,然后使用`ServletFileUpload`实例解析请求。`ServletFileUpload`能解析`multipart/form-data`编码的请求。
4. **处理FileItem对象**:解析请求后,会得到一系列`FileItem`对象。其中,非文件字段将以`FormField`形式存在,文件字段将以`DiskFileItem`形式存在。
5. **保存文件**:对于`DiskFileItem`,我们可以访问其`isFormField()`方法来判断是否为文件。如果是文件,调用`write()`方法将其写入服务器指定目录。
6. **异常处理**:在处理过程中,需要捕获可能抛出的`FileUploadException`,如文件大小超过限制、文件类型不合法等。
### 示例代码
```java
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
// ...
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置临时存储路径
factory.setRepository(new File("temp"));
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置最大上传文件大小
upload.setSizeMax(1024 * 1024 * 5); // 5MB
try {
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) {
String fileName = new File(item.getName()).getName();
// 保存文件到服务器
item.write(new File("uploads/" + fileName));
} else {
// 处理表单字段
}
}
} catch (SizeLimitExceededException e) {
// 文件过大处理
} catch (Exception e) {
// 其他异常处理
}
} else {
// 非多部分请求处理
}
}
```
### 总结
通过Servlet和Apache Commons FileUpload库,我们可以轻松实现文件上传功能。关键在于正确解析多部分请求,处理每个`FileItem`,并确保在上传过程中处理可能出现的异常。在实际应用中,还需要考虑安全性问题,例如验证文件类型、大小,以及对上传文件的权限控制等。