批量文件上传 Java 实现

1. 整体流程

下面是实现批量文件上传的整体流程:

gantt
        dateFormat  YYYY-MM-DD
        title 批量文件上传 Java 实现流程

        section 1. 获取上传文件
        获取上传文件  : 2023-06-01, 1d

        section 2. 处理上传文件
        生成文件存储路径 : 2023-06-02, 1d
        保存上传文件到服务器 : 2023-06-03, 2d

        section 3. 返回上传结果
        返回上传结果 : 2023-06-05, 1d

2. 每一步的实现代码

2.1 获取上传文件

首先,我们需要在前端页面中添加一个文件选择框,用于选择要上传的文件。在 HTML 中,可以使用 <input type="file"> 标签来实现文件选择框。

<input type="file" id="fileInput"> <!-- 用于选择文件的文件选择框 -->

接下来,在后端 Java 代码中,我们需要接收前端传递过来的文件数据。可以使用 Java 的 Servlet 来处理文件上传请求。在 Servlet 中,可以通过 request.getPart("file") 方法来获取上传的文件。

Part filePart = request.getPart("file"); // 获取上传的文件

2.2 处理上传文件

在处理上传文件之前,我们需要生成文件在服务器中的存储路径。可以使用当前日期时间作为文件名,确保文件名的唯一性。

String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); // 生成文件名
String filePath = "/path/to/upload/directory/" + fileName; // 生成文件存储路径

然后,我们需要将上传的文件保存到服务器的指定路径中。可以使用文件流来实现文件的保存。

try (InputStream fileInputStream = filePart.getInputStream();
     OutputStream fileOutputStream = new FileOutputStream(filePath)) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = fileInputStream.read(buffer)) != -1) {
        fileOutputStream.write(buffer, 0, bytesRead); // 将文件写入输出流
    }
}

2.3 返回上传结果

最后,我们需要返回上传结果给前端页面,告诉用户文件是否上传成功。可以使用 JSON 格式来返回结果。

response.setContentType("application/json"); // 设置响应内容类型为 JSON
response.setCharacterEncoding("UTF-8"); // 设置响应编码为 UTF-8

JSONObject result = new JSONObject();
result.put("success", true);
result.put("message", "文件上传成功");
response.getWriter().write(result.toString()); // 将结果写入响应

3. 完整代码示例

下面是完整的 Java 代码示例:

import org.json.JSONObject;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/upload")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part filePart = request.getPart("file"); // 获取上传的文件

        // 生成文件存储路径
        String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        String filePath = "/path/to/upload/directory/" + fileName;

        // 保存上传文件到服务器
        try (InputStream fileInputStream = filePart.getInputStream();
             OutputStream fileOutputStream = new FileOutputStream(filePath)) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                fileOutputStream.write(buffer, 0, bytesRead); // 将文件写入输出流
            }
        }

        // 返回上传结果
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");

        JSONObject result = new JSONObject();
        result.put("success", true);
        result.put("message", "文件上传成功");
        response.getWriter().write(result.toString());
    }
}

在 HTML 页面中,使用以下代码来发送文件上传请求:

function uploadFile() {
    var fileInput = document.getElementById("fileInput");
    var file = fileInput.files[0];

    var formData = new FormData();
    formData.append("file", file);

    var xhr = new XMLHttpRequest();
    xhr.open("POST", "/upload", true);
    xhr.onreadystatechange