Java 实现文件分片上传功能

文件分片上传是指将一个较大的文件分割成多个小块(分片),然后分别上传这些小块,最后将它们合并成完整的文件。这种方式可以避免大文件一次性上传造成的网络延迟和内存占用过高的问题,并且还能够实现断点续传的功能。

在 Java 中,可以通过以下几个步骤来实现文件分片上传功能:

1. 将文件分割成小块

Java 的 FileInputStream 类提供了读取文件的功能。我们可以使用该类读取要上传的文件,并将文件分割成小块。以下是一个示例代码:

import java.io.*;

public class FileSplitter {

    public static void splitFile(String filePath, int chunkSize) throws IOException {
        File file = new File(filePath);
        FileInputStream fis = new FileInputStream(file);
        byte[] buffer = new byte[chunkSize];

        int part = 1;
        int bytesRead;
        while ((bytesRead = fis.read(buffer)) != -1) {
            String fileName = file.getName() + ".part" + part;
            FileOutputStream fos = new FileOutputStream(fileName);
            fos.write(buffer, 0, bytesRead);
            fos.close();
            part++;
        }

        fis.close();
    }

    public static void main(String[] args) throws IOException {
        splitFile("path/to/file", 1024 * 1024); // 每个分片大小为 1MB
    }
}

上述代码中,splitFile 方法接收两个参数:filePath 表示要上传的文件路径,chunkSize 表示每个分片的大小。在 splitFile 方法中,我们首先创建一个 FileInputStream 对象来读取文件。然后使用一个缓冲区数组 buffer 来保存每次读取的数据。在循环中,我们通过 fis.read(buffer) 方法读取数据,并将数据写入到分片文件中。最后,关闭输入流和输出流。

2. 上传分片文件

接下来,我们需要上传分片文件到服务器。可以使用 Java 的网络编程库,如 java.net 包中的 HttpURLConnection 类来实现。以下是一个示例代码:

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

public class FileUploader {

    public static void uploadFile(String url, String filePath) throws IOException {
        File file = new File(filePath);
        FileInputStream fis = new FileInputStream(file);

        URL serverUrl = new URL(url);
        HttpURLConnection connection = (HttpURLConnection) serverUrl.openConnection();
        connection.setRequestMethod("POST");
        connection.setDoOutput(true);

        OutputStream os = connection.getOutputStream();
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = fis.read(buffer)) != -1) {
            os.write(buffer, 0, bytesRead);
        }
        os.close();

        fis.close();
        connection.disconnect();
    }

    public static void main(String[] args) throws IOException {
        uploadFile(" "path/to/file.part1");
    }
}

上述代码中,uploadFile 方法接收两个参数:url 表示上传的目标 URL,filePath 表示要上传的文件路径。在 uploadFile 方法中,我们首先创建一个 FileInputStream 对象来读取分片文件。然后创建一个 URL 对象来表示上传目标的 URL。接着,我们通过 serverUrl.openConnection() 方法获取一个 HttpURLConnection 对象,并设置请求方法为 POST。最后,我们通过 connection.getOutputStream() 方法获取一个输出流对象,并将分片文件的数据写入到输出流中。最后,关闭输入流和输出流,并断开连接。

3. 合并分片文件

最后一步是将所有的分片文件合并成完整的文件。以下是一个示例代码:

import java.io.*;

public class FileMerger {

    public static void mergeFiles(String filePath, String[] partFiles) throws IOException {
        File file = new File(filePath);
        FileOutputStream fos = new FileOutputStream(file);

        byte[] buffer = new byte[1024];
        for (String partFile : partFiles) {
            FileInputStream fis = new FileInputStream(partFile);
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
            }
            fis.close();
        }

        fos.close();
    }

    public static void main(String[] args) throws IOException {
        String[] partFiles = {"path/to/file.part1", "path/to/file.part2", "path/to/file.part3"};
        mergeFiles("path/to/file", partFiles);