Servlet实现文件上传:getReader(), getInputStream(), getPart()与getParts(...

0 下载量 127 浏览量 更新于2024-09-01 收藏 72KB PDF 举报
"这篇教程介绍了如何使用Servlet处理文件上传,主要涵盖了通过`getReader()`、`getInputStream()`以及`getPart()`和`getParts()`方法的不同实现方式。" 在Java Web开发中,Servlet是一个用于扩展服务器功能的Java类,特别适用于处理HTTP请求。当涉及到文件上传时,Servlet提供了一套API来接收并处理这些请求。本教程以四个示例(Demo)阐述了如何使用Servlet来完成文件上传任务。 一、使用`getReader()`和`getInputStream()` 在传统的方式中,如果上传的文件与表单数据混合在一起,可以使用`getReader()`读取文本数据,但处理文件上传时通常使用`getInputStream()`。在Demo1中: 1. HTML表单采用`POST`方法提交,并设置`enctype="multipart/form-data"`,这是处理文件上传所必需的。 2. 表单包含一个`<input type="file">`元素,用户可以选择要上传的文件。 3. Servlet部分,继承自`HttpServlet`,重写`doPost()`方法。在这里,`HttpServletRequest`的`getInputStream()`方法被用来读取上传的文件内容。然后,使用`DataInputStream`和`FileOutputStream`将接收到的数据写入到服务器的某个位置。 ```java //简化版Servlet处理代码 try { DataInputStream input = new DataInputStream(request.getInputStream()); FileOutputStream fileOut = new FileOutputStream("/path/to/save/file"); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = input.read(buffer)) != -1) { fileOut.write(buffer, 0, bytesRead); } fileOut.close(); input.close(); } catch (IOException e) { // 处理异常 } ``` 这种方式虽然简单,但没有处理文件名、大小等信息,且不适用于多个文件上传。 二、使用`getPart()`和`getParts()` 自Java Servlet 3.0起,提供了更高级的API来处理文件上传。`HttpServletRequest`提供了`getPart()`和`getParts()`方法,它们可以方便地获取上传的单个或多个文件。 - `getPart(String name)`:根据文件字段名获取`Part`对象,每个`Part`代表一个文件。 - `getParts()`:返回`Part`对象的`Enumeration`,适合处理多个文件上传。 使用`Part`对象,可以获取文件名、大小等信息,同时提供了`write()`方法直接写入到服务器文件系统,简化了文件保存的逻辑。 ```java Part filePart = request.getPart("filename"); String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); InputStream fileContent = filePart.getInputStream(); try (OutputStream out = new FileOutputStream("/path/to/save/" + fileName)) { byte[] buffer = new byte[1024]; int read; while ((read = fileContent.read(buffer)) > 0) { out.write(buffer, 0, read); } } catch (IOException e) { // 处理异常 } ``` 以上就是使用Servlet处理文件上传的基本方法,无论是使用`getInputStream()`的原始方式,还是使用`getPart()`和`getParts()`的现代API,都需要注意文件上传的安全性和错误处理,如文件大小限制、非法文件类型检查以及异常捕获。在实际项目中,通常会结合使用Multipart解析库,如Apache Commons FileUpload或Spring的MultipartFile,以提供更强大的文件上传功能。