📜  Servlet – 上传文件(1)

📅  最后修改于: 2023-12-03 15:34:56.764000             🧑  作者: Mango

Servlet – 上传文件

Servlet是Java Web开发中的一种重要技术,可以用于处理客户端发送的请求和返回响应数据。本文将介绍如何使用Servlet实现文件上传功能。

HTML 页面设置

首先,我们需要在页面中加入一个文件上传表单,如下所示:

<form action="uploadServlet" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="上传文件">
</form>

注意,表单的enctype属性必须设置为multipart/form-data。否则,文件上传功能将无法实现。

Servlet 处理上传文件请求

接下来,处理上传请求的Servlet代码如下:

@WebServlet("/uploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part filePart = request.getPart("file");
        InputStream fileContent = filePart.getInputStream();
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();
        // 处理文件上传逻辑
    }
}

代码解释:

  • @WebServlet注解设置Servlet URL映射地址。本例中,上传文件表单的action属性为“uploadServlet”,因此在代码中添加该注解,并将参数设置为“/uploadServlet”。
  • @MultipartConfig注解告诉Servlet容器这个Servlet是用来处理multipart请求的(即包含文件上传的请求)。这个注解指定最大允许上传文件大小和允许上传的文件类型。
  • 获取上传的文件内容可以通过request.getPart方法获取输入流,从而读取文件内容。
  • 获取文件名可以通过Part.getSubmittedFileName()方法获取,需要使用java.nio.file.Paths解析文件名。
文件保存

最后,将上传的文件保存到指定位置。

try (OutputStream out = new FileOutputStream(new File("/path/to/save/" + fileName))) {
    int read;
    final byte[] bytes = new byte[1024];
    while ((read = fileContent.read(bytes)) != -1) {
        out.write(bytes, 0, read);
    }
}

代码解释:

  • 上传文件成功后,从前面的代码中可以获取文件内容和文件名。
  • 使用java.io.FileOutputStream保存文件。注意,这里需要指定保存的文件路径和文件名。
完整示例

完整的Servlet代码如下所示:

@WebServlet("/uploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part filePart = request.getPart("file");
        InputStream fileContent = filePart.getInputStream();
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();

        try (OutputStream out = new FileOutputStream(new File("/path/to/save/" + fileName))) {
            int read;
            final byte[] bytes = new byte[1024];
            while ((read = fileContent.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
        }

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        writer.append("<html><head></head><body>");
        writer.append("<p>文件已上传至 /path/to/save/" + fileName + "</p>");
        writer.append("</body></html>");
    }
}
总结

本文介绍了如何使用Servlet实现文件上传,包括前端页面、Servlet处理文件上传请求、文件保存和完整代码示例。希望对您有所帮助。