Java文件上传及读取文件内容

文件上传是一种常见的需求,特别是在Web开发中。在Java中,可以使用Multipart文件上传来实现文件上传功能。本文将介绍如何使用Java实现文件上传,并读取上传的文件内容。

1. 文件上传

文件上传是将本地文件传输到服务器的过程,Java提供了多种方式实现文件上传,包括使用原生的Servlet API、Apache Commons FileUpload、Spring MVC等。

1.1 使用Servlet API实现文件上传

以下是使用Servlet API实现文件上传的示例代码:

@WebServlet("/upload")
@MultipartConfig(
    fileSizeThreshold = 1024 * 1024 * 2, // 设置文件大小阈值
    maxFileSize = 1024 * 1024 * 10, // 设置单个文件的最大大小
    maxRequestSize = 1024 * 1024 * 50 // 设置请求的总大小
)
public class FileUploadServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 检查是否为文件上传请求
        if (!ServletFileUpload.isMultipartContent(request)) {
            // 非文件上传请求,返回错误信息
            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Only file upload requests are accepted");
            return;
        }

        try {
            // 创建文件上传处理器
            ServletFileUpload upload = new ServletFileUpload();

            // 解析请求,获取文件项列表
            List<FileItem> items = upload.parseRequest(request);

            // 处理文件项
            for (FileItem item : items) {
                // 检查是否为文件
                if (item.isFormField()) {
                    // 非文件项,处理表单字段
                    String fieldName = item.getFieldName();
                    String fieldValue = item.getString();
                    // 处理表单字段数据
                } else {
                    // 文件项,处理文件上传
                    String fileName = item.getName();
                    // 保存文件到服务器
                    File uploadedFile = new File("/path/to/save/" + fileName);
                    item.write(uploadedFile);
                    // 处理上传的文件
                }
            }

            // 返回上传成功信息
            response.getWriter().write("File uploaded successfully");
        } catch (Exception e) {
            // 处理文件上传异常
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Failed to upload file");
        }
    }
}

1.2 使用Apache Commons FileUpload实现文件上传

Apache Commons FileUpload是一个常用的文件上传组件,可以方便地实现文件上传功能。以下是使用Apache Commons FileUpload实现文件上传的示例代码:

public class FileUploadUtil {

    public static void uploadFile(HttpServletRequest request, String savePath) throws FileUploadException, IOException {
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // 设置缓冲区大小
        factory.setSizeThreshold(4096);

        // 设置临时文件目录
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

        ServletFileUpload upload = new ServletFileUpload(factory);

        // 设置单个文件的最大大小
        upload.setFileSizeMax(1024 * 1024 * 10);

        // 设置请求的总大小
        upload.setSizeMax(1024 * 1024 * 50);

        List<FileItem> items = upload.parseRequest(request);

        for (FileItem item : items) {
            if (!item.isFormField()) {
                String fileName = new File(item.getName()).getName();
                String filePath = savePath + File.separator + fileName;
                File uploadedFile = new File(filePath);
                item.write(uploadedFile);
            }
        }
    }
}

2. 读取文件内容

读取文件内容是文件上传后的常见操作,Java提供了多种方式读取文件内容,包括使用BufferedReader、FileReader、Apache Commons IO等。

以下是使用BufferedReader读取文件内容的示例代码:

public class FileReadUtil {

    public static String readFile(String filePath) throws IOException {
        StringBuilder content = new StringBuilder();
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(filePath));
            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line).append("\n");
            }
        } finally {
            if (reader != null) {
                reader.close();
            }
        }
        return content.toString();
    }
}

3. 序列图

以下是文件上传及读取文件内容的序列图:

sequenceDiagram
    participant Client
    participant Server
    participant FileUploadServlet
    participant FileReadUtil

    Client->>Server: 发送文件上传请求
    Server->>FileUploadServlet: 处理文件上传请求
    FileUploadServlet->>Server: 保存上传的文件
    Server-->>Client: 返回