使用Servlet进行多文件上传的实战教程

1 下载量 2 浏览量 更新于2024-09-02 收藏 78KB PDF 举报
本资源提供了一个使用Servlet实现文件上传的示例,特别是支持多文件上传。为了实现这一功能,需要引入Apache Commons FileUpload和Commons IO两个第三方库的jar包,分别是`commons-fileupload-1.2.2-bin.zip`和`commons-io-2.3-bin.zip`。将这两个jar包添加到项目的`lib`目录下,以支持文件处理的底层逻辑。 文件上传在HTML表单中通常通过POST方法进行,并且表单的`enctype`属性必须设置为`multipart/form-data`,不同于默认的`application/x-www-form-urlencoded`。这样的设置使得浏览器能够传递二进制数据,如图片或文档等文件内容。 以下是一个简单的JSP页面(`fileupload.jsp`)示例,用于展示如何创建一个文件上传的表单: ```jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'fileupload.jsp' starting page</title> <!-- 其他meta标签和CSS链接 --> </head> <body> <form action="FileUpLoad" enctype="multipart/form-data" method="post"> <!-- 添加文件选择字段和其他表单元素 --> <input type="file" name="file" multiple> <input type="submit" value="上传"> </form> </body> </html> ``` 在Servlet端,你需要处理`POST`请求,解析上传的文件。Apache Commons FileUpload库提供了处理`multipart/form-data`编码类型请求的API。首先,检查请求是否是多部分的,然后创建一个`DiskFileItemFactory`来配置临时存储和大小限制。接着,使用`ServletFileUpload`实例解析请求并迭代文件项。每个文件项可以读取为字节流,然后保存到服务器的指定位置。 这是一个简化的Servlet处理文件上传的代码片段: ```java import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) { DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置临时目录和大小限制 factory.setSizeThreshold(1024 * 1024); // 1MB factory.setRepository(new File("/tmp")); ServletFileUpload upload = new ServletFileUpload(factory); try { List<FileItem> items = upload.parseRequest(request); for (FileItem item : items) { if (!item.isFormField()) { String fileName = item.getName(); // 保存文件到服务器的指定路径 File storeFile = new File("/path/to/save/files", fileName); item.write(storeFile); // 可以在此处处理其他逻辑,如验证文件类型、大小等 } } } catch (FileUploadException e) { throw new ServletException("Error parsing file upload request.", e); } } else { // 如果不是多部分请求,处理错误或返回提示信息 } } ``` Servlet结合Apache Commons库可以轻松处理文件上传,包括多文件上传。确保正确配置表单和Servlet,以实现安全高效的文件上传功能。在实际应用中,还需要考虑错误处理、文件验证、存储策略以及安全性措施,例如防止上传恶意文件或超出服务器存储能力的大文件。