MinIO FTP 断点续传
生活随笔
收集整理的這篇文章主要介紹了
MinIO FTP 断点续传
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MinIO FTP 斷點續傳
對于minio來說,使用minio官方的Java SDK和開啟FTP都是不支持斷點續傳的。對于要實現http接口的斷點續傳,可以通過調用Amazon S3 REST API來實現,可以參考開源項目:https://gitee.com/Gary2016/minio-upload
本文是關于FTP斷點續傳。
FTP斷點續傳方案
啟動一個FTP服務器,此FTP支持斷點續傳。然后將FTP上傳的文件同步到MinIO
同步的方式有兩種:
- 通過定時任務掃描指定目錄(ftp上傳時也上傳到指定目錄),如果有更新時間大于Minio中最新對象的上傳時間的,那么就說明應該將他同步到Minio上
- 提供一個按鈕,給用戶可以手動刷新,觸發ftp指定文件夾下的“符合條件的”文件同步到Minio
實現
下面給出定時任務的代碼,基本流程是:
- 每一個minio object的信息我都在數據庫中記錄。我先從數據庫中查詢最新上傳的minio的object的date
- Java掃描ftp約定好上傳的目錄,如果文件的modify time 大于 minio object最新上傳的 time,那么說明此文件應該同步到上傳到minio上
- 拿到這些應該上傳到minio 的file,for循環以此上傳即可。
代碼如下:
@Value("${ftpDirPath}")
private String ftpDirPath;
MinioClient minioClient;
@PostConstruct
void init() {
minioClient = MinioClient.builder()
.endpoint("http://" + minioAddress)
.credentials(minioAccessKey, minioSecretKey)
.build();
}
@SneakyThrows
@Scheduled(fixedDelay = 60 * 60 * 1000, initialDelay = 10 * 60 * 1000)
public void checkFtpServer() {
log.info("Check ftp server /opt/ftp directory have new file upload.");
// get latest time form minio_object table. if file update time is bigger than minio_object latest time.
// then we should upload the file to minio.
// notice: if i use update time, I should ensure linux date is same as database date (notice same timezone!!)
MinioObjectDO latestDateDO = minioObjectDao.getLatestDate();
long latestTime;
if (latestDateDO == null) {
latestTime = 0L;
} else {
latestTime = latestDateDO.getUploadTime().getTime();
}
LinkedList<File> needUploadToMinioFile = getDirAllFileFilterWithLastModify(ftpDirPath, latestTime);
// upload file to minio
for (File file : needUploadToMinioFile) {
InputStream initialStream = Files.newInputStream(file.toPath());
minioClient.putObject(
PutObjectArgs.builder().bucket("cogent").object(removeFtpPath(file.getAbsolutePath())).stream(
initialStream, -1, 10485760)
.build());
initialStream.close();
log.info("upload file: {} successfully", file.getName());
}
}
private String removeFtpPath(String absolutePath) {
return absolutePath.substring(ftpDirPath.length() + 1);
}
private LinkedList<File> getDirAllFileFilterWithLastModify(String ftpDirPath,long latestTime) {
File dirPath = new File(ftpDirPath);
// 2023-12-01 時間戳
long time = latestTime;
LinkedList<File> filteredFiles = new LinkedList<>();
process(dirPath, filteredFiles, time);
return filteredFiles;
}
private void process(File dirPath, LinkedList<File> filteredFiles, long time) {
File[] files = dirPath.listFiles();
for (File file : files) {
if (file.isDirectory()) {
process(file, filteredFiles, time);
} else {
if (file.lastModified() >= time) {
filteredFiles.add(file);
}
}
}
}
這里只放定時任務的。
issue
關于斷點續傳只上傳了部分文件
ftp斷點續傳只上傳了部分文件,然后這部分文件被同步到了minio上。這其實沒有問題,如果ftp接著上傳剩下的文件,那么文件的updateTime就會修改,那么下次再同步時會再次上傳此文件,對于同名的object,minio進行覆蓋。
總結
以上是生活随笔為你收集整理的MinIO FTP 断点续传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 记录一次K8s pod被杀的排查过程
- 下一篇: 原创:党波涛:普通家庭孩子怎么才能上清华