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

实现

下面给出定时任务的代码,基本流程是:

  1. 每一个minio object的信息我都在数据库中记录。我先从数据库中查询最新上传的minio的object的date
  2. Java扫描ftp约定好上传的目录,如果文件的modify time 大于 minio object最新上传的 time,那么说明此文件应该同步到上传到minio上
  3. 拿到这些应该上传到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 断点续传的更多相关文章

  1. 【大话QT之十】实现FTP断点续传(需要设置ftp服务器为“PASV”被动接收方式)

    应用需求: 网盘开发工作逐步进入各部分的整合阶段,当用户在客户端修改或新增加一个文件时,该文件要同步上传到服务器端对应的用户目录下,因此针对数据传输(即:上传.下载)这一块现在既定了三种传输方式,即: ...

  2. 实现FTP断点续传

    应用需求: 网盘开发工作逐步进入各部分的整合阶段,当用户在客户端修改或新增加一个文件时,该文件要同步上传到服务器端对应的用户目录下,因此针对数据传输(即:上传.下载)这一块现在既定了三种传输方式,即: ...

  3. Java ftp断点续传

    FtpTransFile类 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...

  4. 【大话QT之十】实现FTP断点续传

    应用需求: 网盘开发工作逐步进入各部分的整合阶段,当用户在client改动或新添加一个文件时.该文件要同步上传到server端相应的用户文件夹下,因此针对传输数据(即:上传.下载)这一块如今既定了三种 ...

  5. ftp断点续传

    有时候ftp的文件太大了 容易断掉 使用shell下载 1 #!/bin/bash 2 cd /data2/GATK2/refSeqDB/1000genomePhase3 3 ftp -v -n 19 ...

  6. edtftpj让Java上传FTP文件支持断点续传

    在用Java实现FTP上传文件功能时,特别是上传大文件的时候,可以需要这样的功能:程序在上传的过程中意外终止了,文件传了一大半,想从断掉了地方继续传:或者想做类似迅雷下载类似的功能,文件太大,今天传一 ...

  7. 用windows自带的ftp.exe实现断点续传的方法

    摘自http://www.jb51.net/article/10604.htm 动画下载地址: http://www.chinesehack.org/soft/book/goonftp-jc.rar ...

  8. TCP/IP协议原理与应用笔记02:断点续传

    1.断点续传简介:       FTP(文件传输协议的简称)(File Transfer Protocol. FTP)客户端软件断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人 ...

  9. 学习笔记之 curl 命令用法详解

    [前言]     本文翻译和整理自 Linux-2.6.32 中和 curl 相关的 Manual Page 描述文档. 文档目的仅在提醒读者所遗忘的知识点,故在整理时削弱了阅读流畅性,适用于对 cu ...

  10. python基础----文件处理

    一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 正趣果上果 Interesting fruit fruit 词:郭婞 曲:陈粒 编曲/混音/和声:燕池 萧: ...

随机推荐

  1. Github的一个奇技淫巧

    背景 前段时间给 VictoriaLogs 提交了一个 PR: https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4934 本来一切都很顺 ...

  2. 用Rust手把手编写一个Proxy(代理), 动工

    用Rust手把手编写一个Proxy(代理), 动工 项目 ++wmproxy++ gitee 传送门 github 传送门 设计流程图 flowchart LR A[客户端] -->|Http| ...

  3. Three.js中实现对InstanceMesh的碰撞检测

    1. 概述 之前的文章提到,在Three.js中使用InstanceMesh来实现性能优化,可以实现单个Mesh的拾取功能 那,能不能实现碰撞检测呢?肯定是可以的,不过Three.js中并没有直接的A ...

  4. TCP vs UDP:揭秘可靠性与效率之争

    概述 今天我们开始主要讲解TCP的相关知识点.在之前讲解分层章节的时候,我们提到过一个重要观点.在网络层及以下几层,更多的是让主机与主机建立连接,也就是说你的电脑需要知道另一台电脑在哪里才能连接上它. ...

  5. PHPStudy hosts文件可能不存在或被阻止打开及同步hosts失败问题

    在使用PHPStudy建站包时,有时会遇到同步hosts失败的问题,可能是因为hosts文件不存在或被阻止打开.这个问题通常可以通过以下几个步骤解决: 步骤一:检查hosts文件是否存在 首先,我们需 ...

  6. 第一次git上传的完整流程

    第一次git上传的完整流程 使用git简单命令上传代码push到远程仓库 + 简单介绍了一个.git文件结构. 代码上传到gitee和github流程一样的,不过你上传到github可能网不行失败,所 ...

  7. 有关library导入的个人总结和反思

    本来帮助朋友找寻一下android的一些特效的demo,结果找到了一个,朋友试验可以,自己却是在导入项目需要的library的时候总是出问题,真的很是丢人,反省反省. 也许专业人士看来这是非常可笑的问 ...

  8. Arduino – Turn LED ON and OFF With Button

    In this Arduino tutorial I will show you how to turn an LED on and off with a push button. In fact, ...

  9. VLAN虚拟网络

    VLAN 名称:vlan 虚拟局域网(virtual LAN) 用途 由于交换机所有的端口都在同一广播域,只要发送广播会产生大量的垃圾信息,同时会有病毒的安全隐患(病毒). 为了解决上述问题 1.物理 ...

  10. z函数|exkmp|拓展kmp 笔记+图解

    题外话,我找个什么时间把kmp也加一下图解 z函数|exkmp 别担心 这个exkmp和kmp没毛点关系,请放心食用. 本文下标以1开始,为什么?因为1开始就不需要进行长度和下标的转换,长度即下标. ...