Servlet3.0实现文件上传与下载

版权申诉
0 下载量 116 浏览量 更新于2024-08-08 收藏 34KB DOCX 举报
"Servlet实现文件上传和下载" Servlet技术在Java Web开发中扮演着重要的角色,尤其是在处理客户端数据的交互上,比如文件的上传和下载。本文主要探讨如何使用Servlet实现文件上传功能,重点聚焦在Servlet 3.0及以上的版本。 文件上传通常涉及客户端和服务器之间的交互。在客户端,我们需要创建一个HTML表单,该表单使用`multipart/form-data`作为编码类型,以允许上传文件。表单中包含一个`<input type="file">`元素,用户可以通过这个元素选择要上传的文件。例如: ```html <form action="up" method="post" enctype="multipart/form-data"> <input type="file" name="myfile"> <input type="submit" value="上传文件"> </form> ``` 在服务器端,Servlet 3.0引入了内置的文件上传API,不再需要依赖如Apache Commons FileUpload等第三方库。要接收文件,我们首先需要在Servlet上添加`@MultipartConfig`注解,以表明该Servlet可以处理多部分请求。然后,通过`HttpServletRequest`的`getPart`方法,我们可以根据表单控件的`name`属性获取对应的`Part`对象。如果上传了多个文件,可以使用`getParts`方法获取一个`Part`的集合。 以下是一个简化的Servlet示例,演示了如何处理文件上传: ```java @WebServlet("/up") @MultipartConfig public class UploadServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Part filePart = req.getPart("myfile"); // 获取名为'myfile'的Part对象 // 文件名获取比较复杂,因为Part对象不直接提供原始文件名 String fileName = getFileName(filePart); // 创建一个唯一的文件名,例如使用UUID String uniqueFileName = UUID.randomUUID().toString() + "." + fileName.substring(fileName.lastIndexOf(".") + 1); // 获取服务器上用于存储上传文件的路径 String uploadPath = req.getServletContext().getRealPath("/upload"); File uploadedFile = new File(uploadPath, uniqueFileName); // 将Part对象的输入流写入到服务器文件系统 try (InputStream inputStream = filePart.getInputStream(); FileOutputStream outputStream = new FileOutputStream(uploadedFile)) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } } // 返回响应,例如通知用户文件已成功上传 resp.getWriter().write("文件上传成功"); } private String getFileName(Part part) { // 从Content-Disposition头中提取文件名,注意这里假设文件名只包含ASCII字符 String contentDisposition = part.getHeader("Content-Disposition"); String[] parts = contentDisposition.split(";"); for (String partStr : parts) { if (partStr.trim().startsWith("filename")) { return partStr.substring(partStr.indexOf('=') + 1).trim().replace("\"", ""); } } return null; } } ``` 这个示例中,我们首先获取上传的文件Part,然后从Part对象的Content-Disposition头中提取文件名。为了防止文件重名导致覆盖,我们使用UUID生成一个唯一的文件名,并加上原始文件的扩展名。最后,我们将文件保存到服务器指定的路径下,通常是应用的根目录下的一个子目录,如"upload"。 文件下载的实现相对简单,主要是通过HTTP响应将服务器上的文件内容以流的形式发送到客户端。在Servlet中,这通常涉及设置响应的`Content-Type`、`Content-Disposition`头,以及从文件读取内容并写入到响应的输出流中。 Servlet 3.0及以上版本提供了更方便的文件上传机制,简化了开发过程,使得文件上传和下载成为Java Web应用中常见且易于实现的功能。