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);