📜  Servlet-文件上传(1)

📅  最后修改于: 2023-12-03 14:47:25.097000             🧑  作者: Mango

Servlet 文件上传

在Web应用程序开发中,文件上传是个常见的需求,例如上传用户头像,上传文档等等。在Java Web开发中,Servlet技术提供了文件上传的实现方式,本文将介绍如何使用Servlet实现文件上传。

1. 需求分析

在文件上传之前,我们需要明确目标需求,下面是这个文件上传的需求:

  • 用户可以上传一个或多个文件。
  • 每个文件的大小不能超过指定的大小。
  • 每个文件的类型必须为指定的类型。
  • 文件上传完成后,将文件保存到服务器端指定的目录下。
2. 技术选择

在Java Web中,Servlet技术提供了文件上传的实现方式。具体来讲,我们使用Servlet 3.0提供的Part接口,Part接口提供了获取文件名、文件大小等方法,同时也提供了将文件保存到服务器端的方法。

3. 文件上传示例

下面是一个演示文件上传的Servlet示例:

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;

@WebServlet("/upload")
@MultipartConfig(fileSizeThreshold=1024*1024*2, // 2MB
                 maxFileSize=1024*1024*10,      // 10MB
                 maxRequestSize=1024*1024*50)   // 50MB
public class FileUploadServlet extends HttpServlet {

    /**
     * 处理文件上传请求
     */
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
        throws ServletException, IOException {

        // 设置请求和响应的字符集编码
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

        // 保存上传的文件到服务器端的指定目录中
        String uploadPath = this.getServletContext().getRealPath("/upload"); // 获取服务器端指定目录的完整路径
        File uploadDir = new File(uploadPath); // 创建服务器端目录File对象
        if (!uploadDir.exists()) { // 如果服务器端目录不存在,则创建它
            uploadDir.mkdir();
        }

        // 获取上传的文件Part列表
        List<Part> fileParts = (List<Part>) request.getParts().stream()
            .filter(part -> "file".equals(part.getName()))
            .collect(Collectors.toList());

        // 处理上传的每个文件
        for (Part filePart : fileParts) {
            // 获取上传文件的文件名和扩展名
            String fileName = filePart.getSubmittedFileName();
            String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();

            // 判断上传文件的类型和大小是否合法
            if ("jpg".equals(fileExt) || "jpeg".equals(fileExt) || "png".equals(fileExt)) {
                if (filePart.getSize() <= 1024 * 1024 * 10) {
                    // 将上传文件保存到服务器端指定目录中
                    File filePath = new File(uploadDir, fileName);
                    filePart.write(filePath.getAbsolutePath());
                } else {
                    response.getWriter().write("上传的文件大小不能超过10MB!");
                    return;
                }
            } else {
                response.getWriter().write("上传的文件类型必须为JPG/PNG格式!");
                return;
            }
        }

        response.getWriter().write("文件上传成功!");
    }
}
4. 文件上传的配置说明

在Servlet示例中我们使用了@MultipartConfig注解来配置文件上传的相关参数,下面是各个参数的说明:

  • fileSizeThreshold: 文件大小的临界值,当文件大小达到该值时就将其写入磁盘。默认值为0,表示所有上传的文件都将写入磁盘。
  • maxFileSize: 上传文件的最大大小,单位为字节。如果文件大小超过了该值,Web容器就会抛出异常。默认值为-1,表示不限制文件大小。
  • maxRequestSize: 整个multipart请求的最大大小,单位为字节,包括所有上传的文件和其他表单数据。Web容器会保护应用程序不受Dos攻击的影响。默认值为-1,表示不限制请求大小。
5. 结束语

本文介绍了如何使用Servlet技术实现文件上传,包括需求分析、技术选择、文件上传示例以及配置说明。希望各位程序员可以通过本文了解到文件上传的实现方式,并且在实际开发中可以使用这个示例代码加以实践。